PHPCon Poland 2024

ReflectionMethod::getClosure

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

ReflectionMethod::getClosureRetourne une fermeture créée dynamiquement pour la méthode

Description

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

Crée une fermeture qui appellera cette méthode.

Liste de paramètres

object

Interdit pour les méthodes statiques, requis pour les autres méthodes.

Valeurs de retour

Retourne un objet Closure nouvellement crée.

Erreurs / Exceptions

Lance une ValueError si object est null mais que la méthode est non-statique.

Lance une ReflectionException si object n'est pas une instance de la classe dont cette méthode a été déclarée.

Historique

Version Description
8.0.0 object est désormais nullable.
add a note

User Contributed Notes 2 notes

up
18
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
7 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