Fallirà quando proverai a chiamare un metodo protetto o privato su di esso, perché utilizzarlo in questo modo conta come chiamare dall'esterno. Non c'è modo di aggirare questo in 5.3 per quanto ne so, ma come PHP 5.4, funzionerà come previsto, fuori dagli schemi:
class Hello {
private $message = "Hello world\n";
public function createClosure() {
return function() {
echo $this->message;
};
}
}
$hello = new Hello();
$helloPrinter = $hello->createClosure();
$helloPrinter();
Inoltre, sarai in grado di modificare ciò a cui $ this punta in fase di esecuzione, per le funzioni anonymus (rebinding di chiusura):
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();
In effetti, le funzioni anonymus avranno un metodo bindTo () , in cui il primo parametro può essere utilizzato per specificare a cosa punta $ this, e il secondo parametro controlla quale dovrebbe essere il livello di visibilità . Se ometti il secondo parametro, la visibilità sarà come una chiamata da "fuori", es. è possibile accedere solo alle proprietà pubbliche. Prendi nota anche del modo in cui funziona bindTo, non modifica la funzione originale, ne restituisce una nuova .