Post Top Ad

Your Ad Spot

viernes, 15 de mayo de 2020

Usando cierres y $ this dentro de una clase con PHP

Los cierres son realmente útiles, especialmente para crear complementos cuando no se necesita un controlador completo, hoy me encontré con un problema al usar un cierre dentro de una clase e intentar usar $ this-> que resultó en este error:
Usando $ this cuando no está en el contexto del objeto.
El problema es que PHP 5.3 no le permite usar $ this dentro de un cierre, tome este ejemplo. Tengo un método con un controlador dentro. Estoy tratando de usar $ this-> para referirme a un objeto. 
 
public function routes(){

    Router::any('(:all)', function($request) {
        $row = $this->_db->get_post_by_slug($request);
    }

}

Esto resultará en un error cuando se usa PHP 5.3 o menos para 5.4+ funciona bien. Entonces, si todavía estás usando 5.3 ¿POR QUÉ? Lo mejor es actualizar a la última versión estable.
Para que esto sea compatible con versiones anteriores y funcione en 5.3, una variable puede contener una referencia a $ this y eso puede pasarse / vincularse a los cierres.
Para hacer esto, crea una variable y pásala $ this <
$class = $this;
Luego, para los cierres, use la función de uso y pase $ class con un & a no lo pasa como referencia sino que se refiere al objeto real.
 
Router::any('(:all)', function($request) use (&$class){
La parte importante es el uso (& $ class) que hace que $ class esté disponible para el cierre, que es lo mismo que $ this, ahora en lugar de escribir $ this -> _ db, escribiría $ class -> _ db así:
Router::any('(:all)', function($request) use (&$class){
    $row = $class->_db->get_post_by_slug($request);
}
Esto permite que los cierres se refieran a objetos en la clase principal en 5.3 para 5.4+ no se necesitan cambios y $ esto se puede usar libremente.

No hay comentarios.:

Publicar un comentario

Dejanos tu comentario para seguir mejorando!

outbrain

Páginas