PHP 8.6.0 Beta 1 is available for testing

ReflectionMethod::getClosure

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

ReflectionMethod::getClosureВозвращает динамически созданное замыкание для метода

Описание

public function ReflectionMethod::getClosure(? object $object = null ): Closure

Создаёт замыкание, которое будет вызывать метод.

Список параметров

object

Запрещён для статических методов, обязателен для остальных.

Возвращаемые значения

Возвращает только что созданное замыкание (Closure ).

Ошибки

Выбрасывает ValueError , если object является null , но метод является нестатическим.

Выбрасывает исключение ReflectionException , если object не является экземпляром класса, в котором был объявлен этот метод.

Список изменений

Версия Описание
8.0.0 object теперь допускает значение null.

Нашли ошибку?

ИнструкцияИсправлениеСообщение об ошибке
+Добавить

Примечания пользователей 2 notes

up
18
Denis Doronin
13 years ago
You can call private methods with getClosure():
<?php
function call_private_method($object, $method, $args = array()) {
 $reflection = new ReflectionClass(get_class($object));
 $closure = $reflection->getMethod($method)->getClosure($object);
 return call_user_func_array($closure, $args);
}
class Example {
 private $x = 1, $y = 10;
 private function sum() {
 print $this->x + $this->y;
 }
}
call_private_method(new Example(), 'sum');
?>

Output is 11.
up
-2
okto
10 years ago
Use method from another class context.
<?php
class A {
 private $var = 'class A';
 public function getVar() {
 return $this->var;
 }
 public function getCl() {
 return function () {
 $this->getVar();
 };
 }
}
class B {
 private $var = 'class B';
}
$a = new A();
$b = new B();
print $a->getVar() . PHP_EOL;
$reflection = new ReflectionClass(get_class($a));
$closure = $reflection->getMethod('getVar')->getClosure($a);
$get_var_b = $closure->bindTo($b, $b);
print $get_var_b() . PHP_EOL;
// Output:
// class A
// class B
+Добавить

AltStyle によって変換されたページ (->オリジナル) /