PHP Conference Japan 2024

ReflectionMethod::invoke

(PHP 5, PHP 7, PHP 8)

ReflectionMethod::invoke呼叫

說明

public ReflectionMethod::invoke(?object $object, mixed ...$args): mixed

呼叫反射方法。

參數

object

要呼叫方法的物件。對於靜態方法,請將 null 傳遞給此參數。

args

要傳遞給方法的零個或多個參數。它接受要傳遞給方法的可變數量的參數。

回傳值

回傳方法結果。

錯誤/例外

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

如果方法調用失敗,則會產生 ReflectionException

範例

範例 #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()(在參數列表中傳遞參考)。

參見

新增註釋

使用者提供的註釋 3 則註釋

rojaro at gmail dot com
13 年前
注意:如果您想調用受保護或私有的方法,您必須先使用 setAccessible() 方法讓它們可被訪問(參見 https://php.dev.org.tw/reflectionmethod.setaccessible)。
dimitriy at remerov dot ru
12 年前
此方法可用於在子類別實例上調用父類別中被覆寫的公有方法。
以下程式碼將輸出「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;

?>
templargrey at wp dot pl
13 年前
看起來 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));
?>
To Top