Fallará cuando intente llamar a un método privado o protegido, ya que usarlo de esa manera cuenta como llamar desde el exterior. No hay manera de solucionar este problema en 5.3 por lo que yo sé, pero vienen de PHP 5.4, funcionará como se espera, fuera de la caja:
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"
Aún más, usted será capaz de cambiar lo $ esto apunta a en tiempo de ejecución, para las funciones anonymus (revinculación de cierre):
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"
Efectivamente, las funciones anonymus tendrán un bindTo() method, donde el primer parámetro se puede utilizar para especificar lo que $ this puntos a, y el segundo parámetro controla ¿cuál debería ser el nivel de visibilidad. Si omite el segundo parámetro, la visibilidad será como llamar desde el "exterior", ej. solo se puede acceder a las propiedades públicas. También tome nota de la forma en que funciona bindTo, no modifica la función original, , devuelve una nueva.
sólo una convención foro de menor importancia - por lo general es mejor aceptar una respuesta que al editar una pregunta para reflejar su respuesta preferida. Principalmente esto es para que las respuestas sigan teniendo sentido a perpetuidad, pero también para dar crédito a una respuesta correcta. – halfer
Tenga en cuenta que '$ CI = $ this;' y '$ CI = & $ this;' ** no son ** realmente idénticos. Quizás para tus propósitos, pero no son lo mismo. Pruebe '$ CI = 'bla'; var_dump ($ this); 'con ambas versiones para ver la diferencia. – Rudie
@Rudie Estoy agregando la [documentación] (http://php.net/manual/en/language.oop5.references.php) para su comentario – steampowered