Ele falhará quando você tentar chamar um método protegido ou privado nele, porque usá-lo dessa forma conta como uma chamada externa. Não há como contornar isso no 5.3 até onde eu sei, mas com o PHP 5.4, ele funcionará conforme o esperado, pronto para uso:
class Hello {
private $message = "Hello world\n";
public function createClosure() {
return function() {
echo $this->message;
};
}
}
$hello = new Hello();
$helloPrinter = $hello->createClosure();
$helloPrinter();
Ainda mais, você será capaz de alterar o que $ this aponta em tempo de execução, para funções anonymus (religação de encerramento):
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();
Efetivamente, as funções anonymus terão um método bindTo () , onde o primeiro parâmetro pode ser usado para especificar para que $ this aponta, e o segundo parâmetro controla qual deve ser o nível de visibilidade . Se você omitir o segundo parâmetro, a visibilidade será como chamar de "fora", por exemplo. apenas propriedades públicas podem ser acessadas. Observe também como funciona o bindTo, ele não modifica a função original, mas retorna uma nova .