Что такое интерфейс Serializable в PHP?

«Что такое интерфейс Serializable в PHP?» — вопрос из категории PHP Core, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Serializable — это интерфейс в PHP, который позволяет объекту взять под полный контроль процесс своей сериализации (преобразования в строку) и десериализации (восстановления из строки). Это более гибкая альтернатива автоматической сериализации, которую PHP выполняет для публичных и приватных свойств.

Зачем это нужно? Например, когда объект содержит тяжёлые или временные ресурсы (открытые соединения, дескрипторы файлов), которые не имеет смысла сохранять, или когда нужно сериализовать данные в особом формате.

Методы интерфейса:

  • serialize(): string — должен вернуть строковое представление состояния объекта.
  • unserialize(string $data): void — восстанавливает состояние объекта из переданной строки.

Пример реализации:

class SessionData implements Serializable {
    private $userId;
    private $data = [];
    private $tempCache; // Это свойство мы не хотим сериализовать

    public function __construct($userId) {
        $this->userId = $userId;
        $this->tempCache = new HeavyExternalService(); // Ресурсоёмкий объект
    }

    public function serialize(): string {
        // Сериализуем только нужные данные, игнорируем $tempCache
        return serialize([
            'userId' => $this->userId,
            'data' => $this->data
        ]);
    }

    public function unserialize($data): void {
        $unserialized = unserialize($data);
        $this->userId = $unserialized['userId'];
        $this->data = $unserialized['data'];
        $this->tempCache = null; // Инициализируем заново при необходимости
    }
}

// Использование
$session = new SessionData(123);
$sessionString = serialize($session); // Вызовет $session->serialize()
$restoredSession = unserialize($sessionString); // Вызовет $restoredSession->unserialize()

Важное замечание: Начиная с PHP 7.4, рекомендуется использовать магические методы __serialize() и __unserialize(), которые пришли на смену интерфейсу Serializable. Они проще в использовании и избегают некоторых исторических проблем совместимости. Интерфейс Serializable считается устаревшим в PHP 8.1+.