Привет всем! Сегодня поговорим про такую тему, как сериализация объектов в PHP .

Сериализация объектов в 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 вы обязаны вернуть массив, содержащий названия полей, которые должны быть включены в строку. Таким образом, вы можете исключить поля, которые вам не нужны в результирующей строке.

Итак, на этом все. Спасибо за внимание и удачного кодинга!