Métodos mágicos en PHP: __sleep y __wakeup

Métodos mágicos en PHP: __sleep y __wakeup

Lo que voy a mostrarles a continuación es algo que seguramente pasará a formar parte de tus cartas bajo la manga. Y es que los métodos mágicos en PHP pueden ser muy útiles cuando se trata de trabajar con programación orientada a objetos.

Para explicar brevemente de que se tratan estos dos métodos mágicos, comenzaré con comentarles que tanto el método __sleep() como el método __wakeup(), son disparados al serializar ( serialize) y deserializar ( deserialize) una clase que contenga dichos métodos.

El método sleep() se ejecuta al serializar la clase, y el método wakeup() al deserealizarla. Veamos un ejemplo práctico para entender un poco como funciona y ver lo útil que pueden ser estos métodos.

Ejemplo práctico de los métodos mágicos en PHP:

Comenzaremos primero con crear una simple tabla en donde simularemos un sistema de envío de notificaciones en donde almacenaremos un nombre descriptivo, la fecha en que se debe enviar y la configuración de envío de la notificación (titulo, mensaje, destinatario, tipo).

Esta será nuestro simple schema de la base de datos:

CREATE TABLE `notifications` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(80) NOT NULL, `scheduled` datetime NOT NULL, `configuration` blob, `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Lo siguiente será crear nuestra clase de notificaciones, en donde almacenaremos los parámetros que definen la configuración de envío la cual será almacenada en la columna “ configuration

Clase Notification.php

**notification.php**notification.php

Ahora veamos como crear un nuevo envío de notificación en nuestra base de datos utilizando nuestra clase de notificaciones como configuración de parámetros:

addNotification.php

**addNotification.php**addNotification.php

Como se puede observar, se generaron 3 instancias distintas de la clase “ Notification “ para configurar distintos tipos de envíos y posteriormente almacenarlos en nuestra estructura de datos.

Hasta aquí vimos como podemos utilizando el método mágico__sleep()serializar nuestra clase con las propiedades definidas y sus valores específicos para cada instancia.

Para probar lo que llevamos hasta ahora, desde tu terminal, sitúate en el directorio de los archivos y ejecuta:

php addNotification.php

Si todo va bién debemos ver algo como:

Serialización detectada... 
Serialización detectada... 
Serialización detectada... 
Insertando notificación: Prueba Notificacion 1 
Insertando notificación: Prueba Notificacion 2 
Insertando notificación: Prueba Notificacion 3 
Notificaciónes creadas con éxito!

Si echas un vistazo a la columna “ configuration” de nuestra tabla “ notifications “ podrás ver lo siguiente:

"O:12:"Notification":4:{s:8:"*title";s:6:"Noti 1";s:7:"*body";s:39:"Este es el cuerpo de la notificación 1";s:5:"*to";s:30:"fjugal.dev@franciscougalde.com";s:7:"*type";s:5:"EMAIL";}"

Y esto no es más que la clase serializada, y que gracias a nuestro método mágico__sleep()” le indicamos cuales propiedades de todas las que posee, bastarán para ser serializada. Esto es porque no siempre queremos serializar toda la clase entera, si no solo lo necesario. Aquí vemos que solo serializamos algunas de sus propiedades.

Lo siguiente sera entonces acceder ahora a cada registro de nuestra tabla de “ notifications “ para simular el envío de las notificaciones.

sendNotification.php

**sendNotification.php**sendNotification.php

Ahora veamos cómo funciona el método mágico__wakeup()” quien en este caso se dispara al momento de deserializar ( unserialize) nuestra clase.

Ejecutemos:

php sendNotification.php

y veremos algo como:

Deserializando... 
---------------------- NUEVA NOTIFICACIÓN ---------------------- Notificación a enviar:Prueba Notificacion 1 
Scheduled:2018-04-01 20:53:13 
Titulo: Noti 1 
Cuerpo: Este es el cuerpo de la notificación 1 
Destinatario: fjugal.dev@franciscougalde.com 
Tipo: EMAIL 

Enviando notificación... 
Enviando notificación utilizando el payload: {"provider":"EMAIL","params":{"title":"Noti 1","body":"Este es el cuerpo de la notificaci\u00f3n 1","to":"fjugal.dev@franciscougalde.com"}} ... 
---------------------------------------------------------------- 

Deserializando... 
---------------------- NUEVA NOTIFICACIÓN ---------------------- Notificación a enviar:Prueba Notificacion 2 
Scheduled:2018-04-01 20:53:13 
Titulo: Noti 2 
Cuerpo: Este es el cuerpo de la notificación 2 
Destinatario: +34691224675 
Tipo: SMS 

Enviando notificación... 
Enviando notificación utilizando el payload: {"provider":"SMS","params":{"title":"Noti 2","body":"Este es el cuerpo de la notificaci\u00f3n 2","to":"+34691224675"}} ... 
---------------------------------------------------------------- 

Deserializando... 
---------------------- NUEVA NOTIFICACIÓN ---------------------- Notificación a enviar:Prueba Notificacion 3 
Scheduled:2018-04-01 20:53:13 
Titulo: Noti 3 
Cuerpo: Este es el cuerpo de la notificación 3 
Destinatario: info@franciscougalde.com 
Tipo: EMAIL 

Enviando notificación... 
Enviando notificación utilizando el payload: {"provider":"EMAIL","params":{"title":"Noti 3","body":"Este es el cuerpo de la notificaci\u00f3n 3","to":"info@franciscougalde.com"}} ... 
----------------------------------------------------------------

Aquí podemos ver que parte de lo que se imprime, es gracias a que nuestro método mágico__wakeup()” al momento de deserializar la clase, se ejecutó y adicional a rearmar nuestra clase serializada nuevamente en un objeto, procesó los datos en sus propiedades para armar nuestro payload de envío.

Y con esto podemos ver lo super útil que puede llegar a ser esta combinación de los métodos mágicos con el método serialize() de PHP.

Particularmente, utilizo los métodos mágicos en PHP cuando necesito almacenar en una estructura de datos, configuraciones dinámicas que pueden ser basadas en diferentes tipos de objetos y que de otra forma habría que normalizar nuestra base de datos utilizando quizás muchísimas tablas, columnas, entre otros.

Lo interesante de esto es que no importa si programas en Legacy o utilizando algún framework como Symfony, los métodos mágicos en PHP siempre serán tu mejor amigo.

Todo el contenido de este ejemplo práctico puedes descargarlo desde **mi repositorio en github**.

Si te gustó este post, ayúdame a que pueda servirle a muchas más personas, compartiendo mis contenidos en tus redes sociales.

Espero que este post haya sido de gran ayuda para ti, y como siempre, cualquier inquietud o duda que tengas, puedes contactarme por cualquiera de las vías disponibles, o dejando tus comentarios al final de este post. También puedes sugerir que temas o post te gustaría leer a futuro.

Originally published at https://www.franciscougalde.com on April 1, 2018.

Did you find this article valuable?

Support Francisco Ugalde by becoming a sponsor. Any amount is appreciated!