Note: If you want to invoke protected or private methods, you'll first have to make them accessible using the setAccessible() method (see http://php.net/reflectionmethod.setaccessible ).
(PHP 5, PHP 7, PHP 8)
ReflectionMethod::invoke — Вызов
Вызывает отражённый метод.
object
Объект, метод которого требуется вызвать. Для статических методов передаётся null.
args
Ноль или более аргументов, передаваемых методу. Допускается передавать переменное число аргументов.
Возвращает результат выполнения метода.
Выбрасывает исключение ReflectionException, если
в объекте object
нет определения метода.
Выбрасывает исключение ReflectionException, если вызвать метод на исполнение не удалось.
Пример #1 Пример использования ReflectionMethod::invoke()
<?php
class HelloWorld {
public function sayHelloTo($name) {
return 'Привет, ' . $name;
}
}
$reflectionMethod = new ReflectionMethod('HelloWorld', 'sayHelloTo');
echo $reflectionMethod->invoke(new HelloWorld(), 'Майк');
?>
Результат выполнения приведённого примера:
Привет, Майк
Замечание:
ReflectionMethod::invoke() не может использоваться, если ожидаются ссылочные параметры. Вместо него следует использовать ReflectionMethod::invokeArgs() (передача ссылок в списке аргументов).
Note: If you want to invoke protected or private methods, you'll first have to make them accessible using the setAccessible() method (see http://php.net/reflectionmethod.setaccessible ).
This method can be used to call a overwritten public method of a parent class on an child instance
The following code will output "A":
<?php
class A
{
public function foo()
{
return __CLASS__;
}
}
class B extends A
{
public function foo()
{
return __CLASS__;
}
}
$b = new B();
$reflection = new ReflectionObject($b);
$parentReflection = $reflection->getParentClass();
$parentFooReflection = $parentReflection->getMethod('foo');
$data = $parentFooReflection->invoke($b);
echo $data;
?>
Seems that Reflection doesn`t resolve late static bindings - var_dump will show "string 'a' (length=1)".
<?php
class ParentClass { protected static $a = 'a'; static public function init() { return static::$a; } }
class ChildClass extends ParentClass { protected static $a = 'b'; }
$r = new ReflectionClass('ChildClass');
var_dump($r->getMethod('init')->invoke(null));
?>