Что такое интерфейс Serializable в 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+.

Ответ 18+ 🔞

А, ну вот, опять про эту вашу сериализацию! Сидишь такой, пишешь код, и тут бац — нужно объект в строку превратить, а он упёрся рогом, как баран. Ну, Serializable — это как раз твой шанс взять этот процесс в свои ебучки-воробушки и навести там свой порядок.

Смотри, зачем это вообще нужно? Ну, представь, у тебя объект, который жрёт ресурсов, как не в себя — там соединения с базой, файлы какие-то открытые, кэш тяжёлый. И ты его пытаешься serialize() стандартным способом. А он тебе всю эту хрень в строку пихает! Овердохуища получается, да ещё и бесполезное, потому что при восстановлении эти соединения уже битые будут. Вот тут-то Serializable и выручает — ты сам решаешь, что именно из внутренностей объекта стоит сохранить, а что можно выкинуть нахуй с горы.

Интерфейс этот требует всего двух методов:

  • serialize(): string — тут ты должен вернуть строку. Что в неё положить — твои проблемы. Можешь хоть имя кота записать, если оно важно для состояния.
  • unserialize(string $data): void — а тут ты из полученной строки должен объект обратно собрать, как конструктор «Лего».

Вот смотри на пример, сейчас всё станет понятно, ёпта.

class SessionData implements Serializable {
    private $userId;
    private $data = [];
    private $tempCache; // А вот это — наш тяжёлый ресурс, его сериализовать не надо

    public function __construct($userId) {
        $this->userId = $this->userId;
        $this->tempCache = new HeavyExternalService(); // Представь, что тут что-то очень сложное
    }

    public function serialize(): string {
        // Всё, хватит. Мы сериализуем только самое важное, а кэш — нафиг.
        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); // Вызовется НАШ метод serialize()
$restoredSession = unserialize($sessionString); // Вызовется НАШ метод unserialize()

Видишь? Мы сами контролируем, что уходит в строку. Чисто, аккуратно, без лишнего барахла.

Но! Внимание, важный момент, блядь! Начиная с PHP 7.4, умные дядьки придумали способ получше — магические методы __serialize() и __unserialize(). Они, сука, удобнее и без тех граблей, на которые все наступали с этим интерфейсом. А в PHP 8.1 про Serializable и вовсе говорят «устарел, не трогай». Так что если пишешь что-то новое — смотри в сторону этих магических методов. Этот интерфейс — как старый дед, который ещё помнит, как на PHP 4 писали, но для нового проекта брать его уже как-то... подозрение ебать чувствую.