funciones - Usando `$ this` en una función anónima en PHP pre 5.4.0
public function php (5)
Esa es la forma normal en que se hizo.
Por cierto, intente eliminar el &
debería funcionar sin esto, ya que los objetos pasan por ref de cualquier forma.
El manual de PHP indica
No es posible usar
$this
desde la función anónima antes de PHP 5.4.0
en la página de funciones anónimas . Pero he descubierto que puedo hacerlo funcionar asignando $this
a una variable y pasando la variable a una declaración de use
en la definición de la función.
$CI = $this;
$callback = function () use ($CI) {
$CI->public_method();
};
¿Es esta una buena practica?
¿Hay una mejor manera de acceder a $this
dentro de una función anónima utilizando PHP 5.3?
Eso parece correcto si pasas por referencia, es la forma correcta de hacerlo. Si usa PHP 5, no necesita el símbolo &
antes de $this
ya que siempre pasará por referencia independientemente.
Esto esta bien. Creo que podrías hacer esto también:
$CI = $this;
... ya que las asignaciones que involucran objetos siempre copiarán referencias, no objetos enteros.
Fallará cuando intente llamar a un método privado o protegido, porque usarlo de esa manera cuenta como llamar desde el exterior. No hay forma de evitar esto en 5.3 hasta donde yo sé, pero viene PHP 5.4, funcionará como se espera, listo para usar:
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, podrá cambiar lo que $ this apunta a en tiempo de ejecución, para las funciones de anonymus (reenlace 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 método bindTo () , donde el primer parámetro se puede usar para especificar a qué $ esto apunta, 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 .
No siempre confíe en PHP para pasar objetos por referencia, cuando está asignando una referencia, el comportamiento no es el mismo que en la mayoría de los lenguajes OO donde se modifica el puntero original.
tu ejemplo:
$CI = $this;
$callback = function () use ($CI) {
$CI->public_method();
};
debiera ser:
$CI = $this;
$callback = function () use (&$CI) {
$CI->public_method();
};
NOTA: la REFERENCIA "&" y $ CI deben asignarse después de que se realicen las llamadas finales; de lo contrario, es posible que tenga resultados imprevisibles; en PHP, acceder a una referencia no siempre es lo mismo que acceder a la clase original, si tiene sentido.