PHP 8.4.0 RC4 available for testing

ReflectionMethod::getClosure

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

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

Описание

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

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

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

object

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

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

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

Ошибки

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

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

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

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

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

up
14
Denis Doronin
11 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
-1
okto
8 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
To Top