Сериализация объектов в 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('John', 1);
$string = serialize($user);
echo $string;
}
?>
Мы получим строку, хранящую наш объект. Теперь мы можем передать ее, к примеру, скрипту.
Теперь давайте преобразуем нашу строку обратно в наш объект.
$user = unserialize($string);
Проверим, что наш объект работает
echo $user->getName(); // вернет 'John'
Если вы посмотрите на строку, которую сформировала функция serialize, то заметите, что там отсутствуют названия методов. Так что, чтобы все работало, следует подключать класс раньше, чем вызывается функция unserialize.
<?php
spl_autoload_register(function($name) {
require_once $name.'.php';
});
$user = unserialize($string);
?>
Магические методы __sleep и __wakeup
Если вы хотите, чтобы перед тем, как объект преобразуется в строку, или перед тем, как объект образуется из строки, что-то происходило, то используйте магические методы __sleep и __wakeup.
Например
<?php
class User {
// ...
public function __sleep() {
echo 'Начинаем конвертировать объект в строку<br>';
return ['name', 'role'];
}
public function __wakeup() {
echo '<br>Начинаем конвертировать строку в объект';
}
}
?>
Заметьте, что в методе __sleep вы обязаны вернуть массив, содержащий названия полей, которые должны быть включены в строку. Таким образом, вы можете исключить поля, которые вам не нужны в результирующей строке.
Итак, на этом все. Спасибо за внимание и удачного кодинга!
-
- Михаил Русаков
Комментарии (4):
Здравствуйте. А можно, например сформировать строку. Сохранить её в переменную и вернуть её в магическом методе __toString
Ответить
Здравствуйте. Если я Вас правильно понял, то Вы хотите, чтобы при попытке вывода объекта, как строку, выводился результат вызова функции serialize()? Если так, то вот решение: http://pastebin.com/bLfM1J6p
Ответить
Спасибо за статью. А когда следующая статья про создание движка?
Ответить
завтра
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.