Introducción
PHP Manual
PHP Manual»Interfaces y clases predefinidas»Serializable

La interfaz Serializable

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Interfaz que permite personalizar la serialización.

Las clases que implementan esta interfaz ya no soportan __sleep() y __wakeup(). El método serialize() es llamado cada vez que una instancia debe ser serializada. Esto no invoca a __destruct() ni tiene ningún otro efecto secundario, salvo que se programe dentro del método. Cuando los datos son deserializados, la clase es conocida y el método unserialize() apropiado es llamado como constructor en lugar de llamar a __construct(). El constructor puede ser llamado desde el método unserialize() si se desea.

Advertencia

A partir de PHP 8.1.0, una clase que implemente Serializable sin también implementar __serialize() y __unserialize() generará una advertencia de deprecación.

El código nuevo debería utilizar en su lugar los métodos mágicos __serialize() y __unserialize(), disponibles a partir de PHP 7.4.0. Cuando una clase declara a la vez estos métodos y esta interfaz, serialize() siempre utiliza __serialize() y nunca llega a Serializable::serialize(). La deserialización, en cambio, depende del formato de los datos: unos datos escritos por PHP 7.4.0 o posterior son leídos por __unserialize(), y los escritos antes siguen siendo leídos por Serializable::unserialize(). Por lo tanto, implementar Serializable sigue siendo útil para leer esos datos más antiguos, y para satisfacer una declaración de tipo Serializable; declarar los cuatro métodos cubre todos los casos y evita el aviso de deprecación.

Nota:

Los métodos mágicos no tienen una interfaz propia, por lo que una clase que los declara sin implementar Serializable no es una instancia de esta. method_exists() es la forma de detectarlos.

interface Serializable {
/* Métodos */
public function serialize(): ?string
public function unserialize(string $data): void
}

Ejemplo #1 Compatibilidad con PHP 7.1.0 a 7.3.0

Los métodos mágicos contienen la forma serializada, y los métodos de la interfaz delegan en ellos, de modo que una única representación sirve para ambos.

<?php
class Task implements Serializable
{
    private $label;

    public function __construct($label)
    {
        $this->label = $label;
    }

    public function __serialize(): array
    {
        return ['label' => $this->label];
    }

    public function __unserialize(array $data): void
    {
        $this->label = $data['label'];
    }

    // Nunca es llamado a partir de PHP 7.4.0
    public function serialize()
    {
        return serialize($this->__serialize());
    }

    // Sigue siendo llamado a partir de PHP 7.4.0, para datos escritos antes
    public function unserialize($data)
    {
        $this->__unserialize(unserialize($data));
    }
}

var_dump(serialize(new Task('deploy')));
?>

El ejemplo anterior mostrará:

string(40) "O:4:"Task":1:{s:5:"label";s:6:"deploy";}"

Antes de PHP 7.4.0, el mismo código serializa mediante la interfaz y muestra string(47) "C:4:"Task":31:{a:1:{s:5:"label";s:6:"deploy";}}".

Tabla de contenidos

To Top