PHP Conference Japan 2024

ReflectionMethod::invokeArgs

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

ReflectionMethod::invokeArgs呼叫參數

描述

public ReflectionMethod::invokeArgs(?object $object, array $args): mixed

呼叫反射方法並以陣列形式傳遞其參數。

參數

object

要在其上呼叫方法的物件。對於靜態方法,您可以將 null 傳遞給此參數。

args

要傳遞給函式的參數,以 array 形式傳遞。

傳回值

傳回方法結果。

錯誤/例外

如果 object 參數不包含此方法宣告所在的類別的實例,則會拋出 ReflectionException

如果方法呼叫失敗,則會拋出 ReflectionException

變更日誌

版本 描述
8.0.0 args 的鍵現在將被解釋為參數名稱,而不是被靜默忽略。

範例

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

<?php
class HelloWorld {

public function
sayHelloTo($name) {
return
'Hello ' . $name;
}

}

$reflectionMethod = new ReflectionMethod('HelloWorld', 'sayHelloTo');
echo
$reflectionMethod->invokeArgs(new HelloWorld(), array('Mike'));
?>

上述範例會輸出

Hello Mike

備註

注意:

如果函式有需要以參考傳遞的參數,則它們必須在傳遞的參數清單中以參考形式存在。

另請參閱

新增註解

使用者提供的註解 4 則註解

12
serg dot smertin at gmail dot com
14 年前
我們可以進行黑魔法,這在範本區塊呼叫中很有用

<?php
$object
->__named('methodNameHere', array('arg3' => 'three', 'arg1' => 'one'));

...

/**
* 依名稱傳遞方法參數
*
* @param string $method
* @param array $args
* @return mixed
*/
public function __named($method, array $args = array())
{
$reflection = new ReflectionMethod($this, $method);

$pass = array();
foreach(
$reflection->getParameters() as $param)
{
/* @var $param ReflectionParameter */
if(isset($args[$param->getName()]))
{
$pass[] = $args[$param->getName()];
}
else
{
$pass[] = $param->getDefaultValue();
}
}

return
$reflection->invokeArgs($this, $pass);
}
?>
4
agent_harris at secure-mail dot biz
13 年前
針對參考傳遞問題有一個簡單的解決方法
由於反射 API 必須以通用方式處理所有參數,因此它無法判斷您是希望按值還是按參考傳遞資料。

但似乎您也可以決定從呼叫函式或方法的位置傳遞參考(而不僅僅是在其宣告中使用 & 符號前綴)。

所以只需執行以下操作即可;這對我有效

<?php
//...
$method->invoke($object, $inputValue, &$outputValue);
?>

由於這只在陣列和原始資料類型中才是必要的,因此在大多數情況下,事先知道是否需要按參考傳遞應該是可以接受的。但可能也需要始終在宣告中保留 & 符號(因為在實際函式和您的呼叫之間至少有兩層)。

如果這是預期的行為,則在 invoke 和 invokeArgs 的文件中提及它可能是有意義的。
2
CodeCoutureXX at gmail dot com
9 年前
如果您需要在靜態函式上呼叫 ReflectionMethod::invokeArgs(),您可以為 $object 參數傳遞 NULL。

範例

<?php
class myClass {
public static
myStaticFunc($a, $b) {
return
$a + $b;
}
}

$ref = new ReflectionMethod('myClass', 'myStaticFunc');
echo
$ref->invokeArgs(NULL, [12, 7]);
?>

產生以下輸出結果

19
0
cweiske at cweiske dot de
13 年前
以參考傳遞引數是可行的
<?php $rm->invokeArgs($object, array(&$foo, $bar)); ?>
To Top