Il échoue lorsque vous essayez d'appeler un protégé ou privé de la méthode sur elle, parce qu'en l'utilisant de cette façon compte que l'appel de l'extérieur. Il n'y a aucun moyen de contourner cela en 5.3 autant que je sache, mais viennent de PHP 5.4, il fonctionnera comme prévu, la sortie 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(); // outputs "Hello world"
Même plus, vous serez en mesure de changer ce que $this points au moment de l'exécution, pour anonymus fonctions (fermeture de la reliaison):
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(); // outputs "Bye world"
Effectivement, anonymus fonctions auront un bindTo() la méthode, où le premier paramètre peut être utilisé pour spécifier ce que $cette points de, et le second paramètre contrôles de quel devrait être le niveau de visibilité de l'être. Si vous omettez le deuxième paramètre, la visibilité sera semblable à l'appel de "l'extérieur", par exemple. seul le public peut accéder aux propriétés. Aussi prenez note de la façon bindTo œuvres, elle ne modifie pas la fonction d'origine, elle renvoie un nouveau.