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() також дозволяє серіалізувати лише підмножину властивостей об'єкта.