注意:如果您想調用受保護或私有的方法,您必須先使用 setAccessible() 方法讓它們可被訪問(參見 https://php.dev.org.tw/reflectionmethod.setaccessible)。
(PHP 5, PHP 7, PHP 8)
ReflectionMethod::invoke — 呼叫
回傳方法結果。
範例 #1 ReflectionMethod::invoke() 範例
<?php
class HelloWorld {
public function sayHelloTo($name) {
return 'Hello ' . $name;
}
}
$reflectionMethod = new ReflectionMethod('HelloWorld', 'sayHelloTo');
echo $reflectionMethod->invoke(new HelloWorld(), 'Mike');
?>
上述範例將輸出
Hello Mike
注意:
當需要參考參數時,無法使用 ReflectionMethod::invoke()。必須改用 ReflectionMethod::invokeArgs()(在參數列表中傳遞參考)。
注意:如果您想調用受保護或私有的方法,您必須先使用 setAccessible() 方法讓它們可被訪問(參見 https://php.dev.org.tw/reflectionmethod.setaccessible)。
此方法可用於在子類別實例上調用父類別中被覆寫的公有方法。
以下程式碼將輸出「A」。
<?php
類別 A
{
公開 函數 foo()
{
返回 __CLASS__;
}
}
類別 B 繼承 A
{
公開 函數 foo()
{
返回 __CLASS__;
}
}
$b = new B();
$reflection = new ReflectionObject($b);
$parentReflection = $reflection->getParentClass();
$parentFooReflection = $parentReflection->getMethod('foo');
$data = $parentFooReflection->invoke($b);
echo $data;
?>
看起來 Reflection 並未解析後期靜態綁定 - var_dump 將顯示 "string 'a' (length=1)"。
<?php
類別 ParentClass { 保護的 靜態 $a = 'a'; 靜態 公開 函數 init() { 返回 static::$a; } }
類別 ChildClass 繼承 ParentClass { 保護的 靜態 $a = 'b'; }
$r = new ReflectionClass('ChildClass');
var_dump($r->getMethod('init')->invoke(null));
?>