Object Serialization

Оновлено: 09.05.2023

serialize() повертає рядок, що містить байт-потокове представлення будь-якого значення, яке можна зберігати в PHP. unserialize() може використовувати цей рядок для відтворення початкових значень змінних. Використання serialize для збереження об'єкта збереже всі змінні в об'єкті. Методи в об'єкті не будуть збережені, тільки ім'я класу.

Для того, щоб мати можливість розсеріалізувати() об'єкт, потрібно визначити клас цього об'єкта. Тобто, якщо ви маєте об'єкт класу A і серіалізуєте його, ви отримаєте рядок, який посилається на клас A і містить всі значення змінних, що містяться в ньому. Якщо ви хочете мати можливість розсеріалізувати цей об'єкт в іншому файлі, об'єкт класу A, визначення класу A повинно бути присутнім у цьому файлі спочатку. Це можна зробити, наприклад, зберігши визначення класу A у включаємому файлі і включивши цей файл або скориставшись функцією spl_autoload_register().

<?php
// classa.inc:
  
  class A {
      public $one = 1;
    
      public function show_one() {
          echo $this->one;
      }
  }
  
// page1.php:

  include("classa.inc");
  
  $a = new A;
  $s = serialize($a);
  // store $s somewhere where page2.php can find it.
  file_put_contents('store', $s);

// page2.php:
  
  // this is needed for the unserialize to work properly.
  include("classa.inc");

  $s = file_get_contents('store');
  $a = unserialize($s);

  // now use the function show_one() of the $a object.  
  $a->show_one();
?>

Якщо програма серіалізує об'єкти для подальшого використання у програмі, настійно рекомендується, щоб програма включала визначення класу для цього об'єкта у всьому додатку. Якщо цього не зробити, об'єкт може бути не серіалізовано без визначення класу, що призведе до того, що PHP надасть об'єкту клас __PHP_Incomplete_Class_Name, який не матиме методів і зробить об'єкт марним.

Отже, якщо у наведеному вище прикладі $a став частиною сеансу, виконавши session_register("a"), вам слід включити файл classa.inc на всіх ваших сторінках, а не тільки на page1.php і page2.php.

На додаток до наведених вище порад, зауважте, що ви також можете перехоплювати події серіалізації та не серіалізації об'єкта за допомогою методів __sleep() та __wakeup(). Використання __sleep() також дозволяє серіалізувати лише підмножину властивостей об'єкта.