Non riuscirà quando si tenta di chiamare un metodo protetto o privato su di esso, perché utilizzarlo in quel modo conta come chiamare dall'esterno. Non v'è alcun modo per aggirare il punto 5.3 per quanto ne so, ma venire PHP 5.4, funzionerà come previsto, fuori dalla scatola:
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"
Ancor più, si sarà in grado di cambiare ciò che $ ciò mette in evidenza in fase di esecuzione, per le funzioni via anonima (chiusura rebinding):
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"
in effetti, le funzioni via anonima avranno un bindTo() method, dove il primo parametro può essere utilizzato per specificare quali $ this punti, e la seconda controlli dei parametri quale dovrebbe essere il livello di visibilità. Se ometti il secondo parametro, la visibilità sarà come chiamare dal "fuori", ad es. è possibile accedere solo a proprietà pubbliche. Prendi nota di come funziona bindTo, non modifica la funzione originale, ne restituisce uno nuovo.
fonte
2011-12-05 20:10:51
solo una convenzione minore forum - di solito è meglio accettare una risposta che per modificare una domanda in modo da riflettere la risposta preferita. Principalmente questo è così che le risposte hanno ancora senso in perpetuo, ma ovviamente anche per dare credito per una risposta corretta. – halfer
Attenzione che '$ CI = $ this;' e '$ CI = & $ this;' ** non sono ** in realtà identici. Forse per i tuoi scopi, ma non sono la stessa cosa. Prova '$ CI = 'bla'; var_dump ($ this); 'con entrambe le versioni per vedere la differenza. – Rudie
@Rudie Sto aggiungendo la [documentazione] (http://php.net/manual/en/language.oop5.references.php) per il tuo commento – steampowered