# 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**](https://cdn.hashnode.com/res/hashnode/image/upload/v1628329023497/3sokJMhS5.png)***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**](https://cdn.hashnode.com/res/hashnode/image/upload/v1628329025456/Cp3kGkzQ-.png)***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**](https://cdn.hashnode.com/res/hashnode/image/upload/v1628329027294/MsoG_XIEG.png)***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](https://github.com/fjugaldev/magic-methods-php)**.

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](https://www.franciscougalde.com/2018/04/01/desde-cero-metodos-magicos-de-php-sleep-y-wakeup) on April 1, 2018.*
