DESDE CERO: 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á nuestra simple estructura:

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

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

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:

Si todo va bién debemos ver algo como:

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

Y esto no es mas 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

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

Ejecutemos:

y veremos algo como:

Aqui 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.