在使用 call_user_func_array() 的情況下,如果您傳遞一個匿名函式並在其中引用 $this,$this 將忠實地指向定義該函式時的類別上下文。 使用 ReflectionFunction::invokeArgs() 似乎不會保留其原始上下文——即使您在呼叫之前綁定了匿名函式也是如此。在上下文很重要的情況下,我建議使用 call_user_func_array()。
(PHP 5 >= 5.1.2, PHP 7, PHP 8)
ReflectionFunction::invokeArgs — 呼叫函式引數
返回被呼叫函式的結果。
版本 | 說明 |
---|---|
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) }
注意:
如果函式有需要使用參考的參數,則在傳遞的參數列表中,這些參數也必須是參考。
在使用 call_user_func_array() 的情況下,如果您傳遞一個匿名函式並在其中引用 $this,$this 將忠實地指向定義該函式時的類別上下文。 使用 ReflectionFunction::invokeArgs() 似乎不會保留其原始上下文——即使您在呼叫之前綁定了匿名函式也是如此。在上下文很重要的情況下,我建議使用 call_user_func_array()。
我遇到了 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) 開始並新增參數)。 然而,它似乎可以正常工作,至少在單個值可以使用傳址呼叫之前是如此...