Il échouera lorsque vous essayez d'appeler une méthode protégée ou privée dessus, car l'utiliser de cette façon compte comme un appel de l'extérieur. Il n'y a aucun moyen de contourner ce problème dans 5.3 pour autant que je sache, mais avec PHP 5.4, cela fonctionnera comme prévu, hors de la boîte:
class Hello {
private $message = "Hello world\n";
public function createClosure() {
return function() {
echo $this->message;
};
}
}
$hello = new Hello();
$helloPrinter = $hello->createClosure();
$helloPrinter();
De plus, vous pourrez changer ce à quoi $ this pointe au moment de l'exécution, pour les fonctions anonymus (reliure de fermeture):
class Hello {
private $message = "Hello world\n";
public function createClosure() {
return function() {
echo $this->message;
};
}
}
class Bye {
private $message = "Bye world\n";
}
$hello = new Hello();
$helloPrinter = $hello->createClosure();
$bye = new Bye();
$byePrinter = $helloPrinter->bindTo($bye, $bye);
$byePrinter();
En effet, les fonctions anonymus auront une méthode bindTo () , où le premier paramètre peut être utilisé pour spécifier vers quoi $ this pointe, et le second paramètre contrôle quel devrait être le niveau de visibilité . Si vous omettez le deuxième paramètre, la visibilité sera comme un appel de «l'extérieur», par exemple. seules les propriétés publiques sont accessibles. Notez également le fonctionnement de bindTo, il ne modifie pas la fonction d'origine, il en renvoie une nouvelle .