php-header

Closures: mod_fcgid: stderr: PHP Fatal error: Using $this when not in object context in

Las closures son algo genial, y grandes frameworks como symfony las aprovechan para hacer magia prácticamente, pero son relativamente nuevas en el mundo de PHP, y hay veces que dan problemas.

Por ejemplo, el titulo de este post se genera cuando tenes un closure dentro e una clase (está dentro de un método de la clase). cuando querés acceder a $this desde dentro del closure te va a lanzar el error. Un ejemplo:

En este ejemplo estamos queriendo usar el método $this->procesarMatches() desde dentro del closure, y va a fallar por dos motivos el primero es que los closures no pueden acceder a las variables que se encuentren fuera de si mismas, así que $this al estar fuera, es inaccesible. Pero tiene solución, usando use ($this) se puede pasar a $this dentro del closure:

Ahora bien, usando use ($algunavariable, $otravariable) las podemos meter dentro del closure, y mientras que no sea $this, todo va a funcionar bien, pero el caso es que necesitamos $this, y en el momento que hagamos function ($matches) use ($this) vamos a recibir el error que les comento.

¿Por qué?, bueno es una limitación que ha quedado de cuando implementaron closures en PHP. Algún día lo solucionaran, pero mientras tanto la solución es esta:

Si miran bien lo que hicimos es asignar $this a $self y enviamos $self al closure… y así funciona todo sin problemas.

Una nota final: Cualquier método/variable que llames dentro del closure tiene que ser necesariamente publica, sino falla.

Chau!