Вступ
PHP Manual
PHP Manual»Predefined Interfaces and Classes»Serializable

The Serializable interface

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

Interface for customized serializing.

Classes that implement this interface no longer support __sleep() and __wakeup(). The serialize() method is called whenever an instance needs to be serialized. This does not invoke __destruct() or have any other side effect unless programmed inside the method. When the data is unserialized the class is known and the appropriate unserialize() method is called as a constructor instead of calling __construct(). The constructor can be called from within the unserialize() method if desired.

Увага

As of PHP 8.1.0, a class which implements Serializable without also implementing __serialize() and __unserialize() will generate a deprecation warning.

New code should use the __serialize() and __unserialize() magic methods instead, available as of PHP 7.4.0. When a class declares both them and this interface, serialize() always uses __serialize() and never reaches Serializable::serialize(). Unserializing is decided by the format of the data instead: a payload written by PHP 7.4.0 or later is read by __unserialize(), one written before it is still read by Serializable::unserialize(). Implementing Serializable therefore remains of use for reading such older payloads, and for satisfying a Serializable type declaration; declaring all four methods covers every case, and avoids the deprecation notice.

Зауваження:

The magic methods have no interface of their own, so a class which declares them without implementing Serializable is not an instance of it. method_exists() is the way to detect them.

interface Serializable {
/* Методи */
public function serialize(): ?string
public function unserialize(string $data): void
}

Приклад #1 Supporting PHP 7.1.0 through 7.3.0

The magic methods carry the serialized form, and the interface methods delegate to them, so that a single representation serves both.

<?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'];
    }

    // Never called as of PHP 7.4.0
    public function serialize()
    {
        return serialize($this->__serialize());
    }

    // Still called as of PHP 7.4.0, for data written before it
    public function unserialize($data)
    {
        $this->__unserialize(unserialize($data));
    }
}

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

Поданий вище приклад виведе:

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

Prior to PHP 7.4.0, the same code serializes through the interface instead, and outputs string(47) "C:4:"Task":31:{a:1:{s:5:"label";s:6:"deploy";}}".

Зміст

To Top