Ответ
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+.