Сериализация данных
Представьте, что вы создаёте клиент-серверное приложение на PHP, в котором хотите обмениваться информацией со скриптом. Если это ваш случай, то не обойтись без сериализации. Именно она позволяет выполнить преобразование обычного PHP-объекта в строку, которую поймёт скрипт.
Чтобы выполнить преобразование объекта в строку, в PHP применяются специальные функции:
serialize()обеспечивает преобразование объекта в строкуunserialize()выполняет преобразование обратно
Давайте возьмём в качестве примера класс User и создадим его объект:
<?php
class User {
private $name;
private $role;
public function __construct($name, $role) {
$this->name = $name;
$this->role = $role;
}
public function changeName($name) {
$this->name = $name;
}
public function changeRole($role) {
$this->role = $role;
}
public function getName() {
return $this->name;
}
public function getRole() {
return $this->role;
}
}
$user = new User('Tom', 1);
$string = serialize($user);
echo $string;
Результатом станет получение строки, хранящей наш объект. После этого можно передать строку, например, скрипту или сохранить в базу данных.
Давайте теперь выполним преобразование строки обратно в объект:
<?php
class User {
private $name;
private $role;
public function __construct($name, $role) {
$this->name = $name;
$this->role = $role;
}
public function changeName($name) {
$this->name = $name;
}
public function changeRole($role) {
$this->role = $role;
}
public function getName() {
return $this->name;
}
public function getRole() {
return $this->role;
}
}
$user = new User('Tom', 1);
$string = serialize($user);
echo $string;
$user = unserialize($string);
// вернёт Tom
echo $user->getName();
Методы __sleep и __wakeup
Иногда возникает необходимость перед преобразованием объекта в строку выполнить какое-нибудь действие. Для подключения к событиям сериализации и десериализации в PHP используют методы __sleep() и __wakeup(). Метод __sleep() даёт возможность сериализовать только некоторое подмножество свойств объекта. Пример работы данных методов:
<?php
class User {
private $name;
private $role;
public function __sleep() {
echo 'Начинаем конвертировать объект в строку';
echo '<br>';
return ['name', 'role'];
}
public function __wakeup() {
echo '<br>';
echo 'Начинаем конвертировать строку в объект';
}
public function __construct($name, $role) {
$this->name = $name;
$this->role = $role;
}
public function changeName($name) {
$this->name = $name;
}
public function changeRole($role) {
$this->role = $role;
}
public function getName() {
return $this->name;
}
public function getRole() {
return $this->role;
}
}
$user = new User('Tom', 1);
$string = serialize($user);
echo $string;
$user = unserialize($string);
// вернёт Tom
echo $user->getName();