2024 年 PHP Conference Japan

ReflectionFunction::invokeArgs

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

ReflectionFunction::invokeArgs呼叫函式引數

說明

public ReflectionFunction::invokeArgs(陣列 $args): 混合

呼叫函式並以陣列形式傳遞其參數。

參數

args

要傳遞給函式的參數,以陣列形式呈現,類似於 call_user_func_array() 的運作方式。

返回值

返回被呼叫函式的結果。

更新日誌

版本 說明
8.0.0 args 鍵值現在會被解釋為參數名稱,而不是被默默忽略。

範例

範例 #1 ReflectionFunction::invokeArgs() 範例

<?php
function title($title, $name)
{
return
sprintf("%s. %s\r\n", $title, $name);
}

$function = new ReflectionFunction('title');

echo
$function->invokeArgs(array('Dr', 'Phil'));
?>

上述範例將輸出:

Dr. Phil

範例 #2 使用參考的 ReflectionFunction::invokeArgs() 範例

<?php
function get_false_conditions(array $conditions, array &$false_conditions)
{
foreach (
$conditions as $condition) {
if (!
$condition) {
$false_conditions[] = $condition;
}
}
}

$function_ref = new ReflectionFunction('get_false_conditions');

$conditions = array(true, false, -1, 0, 1);
$false_conditions = array();

$function_ref->invokeArgs(array($conditions, &$false_conditions));

var_dump($false_conditions);
?>

上述範例將輸出:

array(2) {
  [0]=>
  bool(false)
  [1]=>
  int(0)
}

注意事項

注意:

如果函式有需要使用參考的參數,則在傳遞的參數列表中,這些參數也必須是參考。

參見

新增註釋

使用者貢獻的註釋 2 則註釋

theyourcomputer at gmail dot com
7 年前
在使用 call_user_func_array() 的情況下,如果您傳遞一個匿名函式並在其中引用 $this,$this 將忠實地指向定義該函式時的類別上下文。 使用 ReflectionFunction::invokeArgs() 似乎不會保留其原始上下文——即使您在呼叫之前綁定了匿名函式也是如此。在上下文很重要的情況下,我建議使用 call_user_func_array()。
Andrea Giammarchi
16 年前
我遇到了 ReflectionFunction 的一個奇怪問題,在 PHP Bugs 的 ticket 44139 中有描述。

如果由於某種原因您需要使用 invoke 或 invokeArgs 呼叫像 array_unshift(內部以傳址方式接受陣列)這樣的函式,您可以使用以下程式碼來避免產生的警告或致命錯誤。

<?php
function unshift(){
$ref = new ReflectionFunction('array_unshift');
$arguments = func_get_args();
return
$ref->invokeArgs(array_merge(array(&$this->arr), $arguments));
}
?>

我不知道效能如何(您也可以手動建立一個陣列,從 array(&$this->something) 開始並新增參數)。 然而,它似乎可以正常工作,至少在單個值可以使用傳址呼叫之前是如此...
To Top