__serialize и __unserialize
Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy. Урок 49 из 91.
Когда вам нужно преобразовать объект в строку для хранения или передачи, PHP использует сериализацию. Магические методы __serialize() и __unserialize() позволяют вам точно контролировать, какие data сохраняются и как они восстанавливаются.
Метод __serialize() возвращает массив данных для сериализации, а __unserialize() получает этот массив и восстанавливает объект:
<?php
class Session {
public function __construct(
private string $userId,
private array $data,
private int $createdAt
) {}
public function __serialize(): array {
return [
'userId' => $this->userId,
'data' => $this->data
];
}
public function __unserialize(array $data): void {
$this->userId = $data['userId'];
$this->data = $data['data'];
$this->createdAt = time();
}
public function getCreatedAt(): int {
return $this->createdAt;
}
}
$session = new Session("user123", ["theme" => "dark"], time());
$serialized = serialize($session);
$restored = unserialize($serialized);
echo "Created at: " . $restored->getCreatedAt();
Обратите внимание, что createdAt исключается из сериализации и получает новую временную метку при десериализации. Это полезно для исключения конфиденциальных данных, временных значений или ресурсов, которые нельзя сериализовать, например подключений к базе данных.
Эти методы заменили старые методы __sleep() и __wakeup() в PHP 7.4, предложив более чистый подход, при котором вы работаете непосредственно с массивами данных, а не с именами property.
Задание
ЛегкоДавайте создадим систему кэширования профиля пользователя, которая демонстрирует, как __serialize() и __unserialize() позволяют управлять тем, какие данные сохраняются и как они восстанавливаются.
Вы распределите код по двум файлам:
UserProfile.php: Создайте классUserProfile, представляющий профиль пользователя с возможностями кэширования. Используйте продвижение параметров конструктора, чтобы определить private properties для$userId(string),$username(string),$email(string) и$accessToken(string). Добавьте private$cachedAtproperty, в котором хранится время кэширования профиля (изначально установите его в"not cached"в конструкторе). Вашему классу нужны:__serialize(): Возвращает array, содержащий толькоuserId,usernameиemail.accessTokenсодержит конфиденциальные данные и никогда не должен сериализоваться. Метка времениcachedAtбудет создана заново при восстановлении.__unserialize(): ВосстанавливаетuserId,usernameиemailиз array данных. Устанавливает дляaccessTokenзначение"expired"(поскольку токены не должны сохраняться).getInfo(): Возвращает string в формате:"[username] ([email]) - Token: [accessToken] - Cached: [cachedAt]"
main.php: Подключите файл UserProfile. Вы получите четыре входных значения: ID пользователя, имя пользователя, email и токен доступа. Создайте экземплярUserProfileс этими значениями. Выведите три строки:- Информацию об original профиле (до сериализации)
- Сериализуйте профиль с помощью
serialize(), затем десериализуйте его с помощьюunserialize(), чтобы создать восстановленный профиль. Выведите информацию о восстановленном профиле. - Выведите
"Token preserved: yes"или"Token preserved: no"в зависимости от того, совпадает ли токен восстановленного профиля с original (подсказка: он не должен совпадать, поскольку при восстановлении токены истекают)
Этот шаблон необходим для безопасного кэширования данных пользователей. Вы хотите сохранять информацию о профиле, но никогда не сохранять конфиденциальные учетные данные, такие как токены доступа. Когда профиль восстанавливается из кэша, токен помечается как expired, что заставляет приложение получить новый.
Попробуйте сами
<?php
require_once 'UserProfile.php';
// Чтение входных данных
$userId = trim(fgets(STDIN));
$username = trim(fgets(STDIN));
$email = trim(fgets(STDIN));
$accessToken = trim(fgets(STDIN));
// TODO: Создать экземпляр UserProfile с входными значениями
// TODO: Вывести информацию исходного профиля (до сериализации)
// TODO: Сериализовать профиль, затем десериализовать его, чтобы создать восстановленный профиль
// TODO: Вывести информацию восстановленного профиля
// TODO: Print "Token preserved: yes" or "Token preserved: no"
// в зависимости от того, совпадает ли токен восстановленного профиля с оригинальным
?>В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово $thisМетодыСвойстваКонструктор (__construct)Деструктор (__destruct)Повторение — простой калькулятор4Наследование
Основы наследованияКлючевое слово parent::Переопределение методовКлючевое слово finalАбстрактные классыПовторение — иерархия сотрудников7Инкапсуляция
Public, Protected, PrivateМодификаторы доступа подробноГеттеры и сеттерыСокрытие информацииПродвижение конструктора (8.0)Повторение — система учёта студентов2Пространства имён и автозагрузка
Введение в пространства имёнКлючевое слово useСтандарт автозагрузки PSR-4Автозагрузчик ComposerПовторение — структурированный проект5Интерфейсы и контракты
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовИнтерфейс и абстрактный классАннотация типов с интерфейсамиПовторение — калькулятор фигур8Магические методы
Введение в магические методы__toString и __debugInfo__get, __set, __isset, __unset__call и __callStatic__clone и клонирование объектов__serialize и __unserializeПовторение — пользовательская коллекция3Свойства классов
Свойства экземпляра и статические свойстваКонстанты в классахСтатические методы и свойстваПриватные и защищённые свойстваСвойства только для чтения (PHP 8.1)Повторение — менеджер банковского счёта6Полиморфизм
Повторение переопределения методовПолиморфизм через интерфейсыАннотации типов и объединённые типыПозднее статическое связываниеПовторение — обработчик платежей9Трейты
Введение в трейтыИспользование нескольких трейтовРазрешение конфликтов трейтовАбстрактные методы в трейтахТрейты и наследование12Паттерны проектирования, часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн StrategyПотренируйтесь самостоятельно: Онлайн-компилятор PHP