(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.
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.
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";}}".