Интерфейс Serializable

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

Введение

Интерфейс ввели для пользовательской сериализации.

Классы, которые реализуют этот интерфейс, больше не поддерживают магические методы __sleep() и __wakeup(). При каждой сериализации экземпляра класса вызывается интерфейсный метод serialize. Этот метод не вызывает метод __destruct() и не выполняет побочных действий, кроме тех, которые запрограммировали внутри метода. Механизм сериализации знает класс, представление которого десериализует, и вместо вызова метода __construct() как конструктор вызывается интерфейсный метод unserialize(), который соответствует классу. Стандартный конструктор вызывают в методе десериализации, если требуется.

Внимание

Начиная с PHP 8.1.0 класс, который реализует интерфейс Serializable без реализации методов __serialize() и __unserialize(), выдаст предупреждение об устаревании.

Обзор интерфейса

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

Примеры

Пример #1 Базовый пример реализации интерфейса

<?php

class obj implements Serializable
{
    private $data;

    public function __construct()
    {
        $this->data = "Мои закрытые данные";
    }

    public function serialize()
    {
        return serialize($this->data);
    }

    public function unserialize($data)
    {
        $this->data = unserialize($data);
    }

    public function getData()
    {
        return $this->data;
    }
}

$obj = new obj();
$ser = serialize($obj);

var_dump($ser);

$newobj = unserialize($ser);

var_dump($newobj->getData());

?>

Вывод приведённого примера будет похож на:

Deprecated: obj implements the Serializable interface, which is deprecated. Implement __serialize() and __unserialize() instead (or in addition, if support for old PHP versions is necessary) in script on line 2
string(59) "C:3:"obj":44:{s:36:"Мои закрытые данные";}"
string(36) "Мои закрытые данные"

Содержание