83

Uso de magic methods

Miguel
mikkel
1456

Antes de comenzar aclaro que primero explicaré la definición de cada metodo mágico y al final insertaré un código completo con cada método mágico explicado con anterioridad.

Uso de __construct():
__construct se utiliza para la inserción de parametros y dependencias para construir el objeto. No necesita ser llamado ya que lo hace automaticamente cuando se crea un objeto.

Uso de __destruct():
Al igual que __construct, __destruct se llama automaticamente al finalizar los procesos del objeto creado. se utiliza para eliminar referencia del objeto creado, el cual liberará la memoria utilizada al crear ese objeto. casi no se utiliza en programas pequeños. pero puede servir como por ejemplo cerrar la conexion a una base de datos al terminar de hacer un consulta. __destruct nunca se le debe pasar variables como parametros.

Uso de __get():
__get() sirve para poder acceder a una variable, que no pueda ser accedida afuera de la clase(ya sea private o protected). para esto se tiene que pasar el nombre de la variable que se quiere acceder como argumento del metodo. Al igual que construct y destruct, no necesita ser llamada ya que lo hace automaticamente. Si intentamos acceder a la variable sin el uso del metodo magico __get, lanzará una excepción.

Uso de __set():
__set que sirve ya sea para cambiar el valor de una propiedad que no es accesible afuera de la clase se tiene que pasar por medio del argumento del metodo la propiedad a acceder y el valor nuevo que desea cambiar. Igual sirve para crear nuevas propiedades de la clase

NOTA: El uso de estos __get() y __set() por ser lentos lentos, no facilitan el autocompletado de código en los IDE, hacen que el mantenimiento y refactorizar sea más largo y complicado. En su lugar se pueden emplear getters y setters.

Uso de __isset():
Con __isset() se verifica la existencia de una propiedad o array. se lanza al llamar a isset() o a empty() sobre propiedades inaccesibles.

Uso de __unset():
Con __unset() se elimina una propiedad de la clase. dicho en otras palabras, se invoca cuando se usa unset() sobre propiedades inaccesibles…

Uso de __sleep():
El método sleep sera invocado cuando pasemos el objeto por la función serialize, de esta forma podremos prepararlo para ser almacenado o para lo que queramos, como siempre el limite es la imaginación de cada cual y los posibles usos que se le pueden dar a esto son muchísimos. Hay que tener en cuenta que siempre ha de devolver un array, es preferible no usar sleep a hacer un return que no sea un array porque php dará un error.

Uso de __wakeup():
El método wakeup se encarga de realizar exactamente lo contrario que sleep, en el momento que deserializamos un objeto con unserialize se invoca a este método, para por ejemplo, restablecer la conexión con la base de datos, o alterar algún atributo.

Uso de __call():
Se utiliza el método mágico __call() para llamar una función que sea inaccesible afuera de la clase

Uso de __callStatic():
Si el método al que se quiere llamar es static se puede emplear __callStatic(). Este método funciona de la misma forma que __call() pero la sintaxis con la que llamar a los métodos será como a los métodos estáticos.

<?phpclassInsertarDatosDelEmpleado{

    //propiedades de la claseprivate $nombre;
    private $tarjetaCredito;

//constructor el cual recibirá el valor de los parametros al crear el objetopublicfunction__construct($nombre){
        
        //al crear el objeto se hará un trigger del construct y se iniciará todo//automaticamente dentro de elecho'<p><h3> INICIANDO CONEXION A BD... </h3></p>';

         //se apunta a la variable tipo el cual recibirá el valor de los parametros a la hora de crear
        $this->nombre = $nombre;
    }

    privatefunctiongetNumeroTarjeta(){
        $this->tarjetaCredito['numero'];
    }

    // metodo magico __get el cual tiene que recibir como parametro el nombre de la variable a acceder.publicfunction__get($propiedad){

        //property_exists comprueba si el objeto o la clase tienen una propiedad//Esta función comprueba si la propiedad dada por property existe en la clase especificada.//devuelve TRUE incluso si la propiedad de la clase tiene el valor NULLif (property_exists($this, $propiedad)) {
            return $this->$propiedad;
        }
    }

    //metodo magico __set que sirve ya sea para cambiar el valor de una propiedad//que no es accesible afuera de la clase o crear una nueva propiedad adentro de la clase//se tiene que pasar por medio del argumento del metodo,//la propiedad a acceder y el valor nuevopublicfunction__set($propiedad, $valor){
        return $this->$propiedad = $valor;
    }

    //con el metodo magico isset se conoce si las propiedades o arreglos no accesibles de la clase existen//tiene que pasar por parametro el nombre de la propiedad a conocer su existenciapublicfunction__isset($propiedad){
        returnisset($this->$propiedad);
    }

    //con el metodo magico unset se elimina una propiedad o array no accesible de la clase//tiene que pasar por parametro el nombre de la propiedad a eliminar de la clasepublicfunction__unset($propiedad){
        unset($this->$propiedad);
    }

    //El método ___toString()_ permite devolver el objeto representado en forma de string.publicfunction__toString(){
        return $this->nombre;
    }

    //se lanza cuando el objeto de una clase está por serializarse, no acepta ningun parametro//se tiene que retornar un arreglo con las propiedades de las clases a serializar//serialize o serializar sirve para el manejo de objetos o arreglos de estructuras de datos// complejas (.json por ejemplo) los cuales no se pueden transportar o almacenar o de alguna otra manera//ser usado afuera de un script php. Se usa si necesitas mandar informacion afuera de los scripts de php//y guardar su tipo y estructura sin ser alterada en el proceso.publicfunction__sleep(){
        echo'procediendo a serializar...';
        returnarray('nombre'); //se serializa la variable nombre

    }

    //se manda a llamar automaticamente cuando un dato se deserializa con la funcion unserialize.//hace lo inverso a __sleeppublicfunction__wakeup(){
        echo'procediendo a deserializar...';
        $this->nombre = 'Juan Perez'; 
    }
    //sirve para acceder metodos no accesibles publicamente y se tiene que retornar//con la funcion call_user_func_array un array con la clase que se quiere acceder y el nombre del metodo//y finalmente un argumento con los valores de ese arraypublicfunction__call($metodo, $valores){
        echo'<p>accediendo automaticamente desde afuera de la clase al metodo privado getNumeroTarjeta</p>';
        return call_user_func_array(array($this, $metodo), $valores);
    }

    //se llama automaticamente y se destruye toda referencia del objeto al finalizar su utilizacionpublicfunction__destruct(){
        echo'<p><h3> CERRANDO CONEXION A BD... </h3></p>';
    }
}

//se crea el objeto y al terminar todo los procesos asignados adentro de la instancia, se destruye//el cual liberará memoria utilizada
$empleado = new InsertarDatosDelEmpleado('Juan');

//intentando acceder a las variables privadas de la clase desde el objeto creadoecho'<p>Nombre: '.$empleado->nombre . '</p>';

//Cambiandole el valor a nombre por medio del metodo __set()
$empleado->nombre = 'Juanito';
//imprimiendo el nuevo valor de nombreecho'<p>Nuevo nombre: '.$empleado->nombre . '</p>';

//creando una nueva propiedad en la clase de tipo privado con el metodo magico __set()
$empleado->edad = 25;

//imprimiendo la nueva propiedad creadaecho'<p> Edad: ' . $empleado->edad . '</p>';
//Imprimir el objeto empleado:echo'<p><h3> Conociendo si la propiedad edad se creó exitosamente dentro de la clase</h3> </p>';
echo var_dump($empleado);

echo'<br>';

//devolverá true si la variable no accesible de la clase existe, en otro caso devolverá falseecho'<p><h3> Conociendo si la propiedad nombre existe adentro de la clase InsertarDatosDelEmpleado</h3> </p>';
echo var_dump(isset($empleado->nombre));

echo'<br>';

//Eliminando la propiedad edad de la clase InsertarDatosDelEmpleado.. </p>';unset($empleado->edad);

echo'<p><h3> Conociendo si la propiedad edad se eliminó de la clase InsertarDatosDelEmpleado..</h3> </p>';
var_dump($empleado);

//imprimiendo en forma string los valores del objeto empleadoecho'<p><h3> Imprimiendo en forma string los valores del objeto empleado de la clase InsertarDatosDelEmpleado.. </h3></p>';
echo'<p>'. $empleado . '</p>';

//propiedad a serializar
$datoSerializado = serialize($empleado);

echo'<p><h3> Imprimiendo la cadena de datos serializados de la clase InsertarDatosDelEmpleado.. </h3></p>';
//imprime  tipo de dato: (s: string, i: integer, b: boolean, d: double o float, N: null), el numero de//caracteres del dato: y finalmente el valor del datoecho'<p>'. $datoSerializado . '</p>';

echo'<p><h3> Imprimiendo la informacion deserializada de la clase InsertarDatosDelEmpleado.. </h3></p>';
echo'<p> DESERIALIZACION CON NUEVA INFORMACION: ' . unserialize($datoSerializado) . '</p>';

$empleado->tarjetaCredito = 123456789;
$empleado->getNumeroTarjeta();
echo'<p> Tarjeta: ' .$empleado->tarjetaCredito .'</p>';
?>
Escribe tu comentario
+ 2
Ordenar por:
2
2605Puntos

Gran aporte compa. 😃

1
5661Puntos

Buen resumen , se agradece el esfuerzo, una critica constructiva, a mi entender el nombre de la clase , no debería hacer referencia a una acción, eso es mas para el nombre de los métodos, podría ser la Clase Empleado directamente o TarjetaCredito , en fin , un sustantivo que mejor represente a esa clase que luego será un Objeto. Saludos.

1
19511Puntos

gracias por el contenido

1
20108Puntos

Gracias por el aporte, excelente.

1
6279Puntos

Gracias por el contenido, no sabes lo mucho que me srivió

1
6279Puntos

Gracias por el contenido, no sabes lo mucho que me srivió

1
3222Puntos

Gracias por compartir esta información

1
11556Puntos

Excelente resumen bro. Estaba viendo las descripciones del manual de PHP y me voló la cabeza, no entendía nada 😆. Pero con el resumen está más digerible. 🙂