serialize() возвращает строку, содержащую представление потока байтов любого значения, которое может быть сохранено в PHP. unserialize() может использовать эту строку для воссоздания исходных значений переменных. Использование сериализации для сохранения объекта сохранит все переменные в объекте. Методы в объекте не будут сохранены, только имя класса.
Чтобы иметь возможность unserialize() объекта, необходимо определить класс этого объекта. То есть, если у вас есть объект класса А и сериализовать его, вы получите строку, которая ссылается на класс А и содержит все значения содержащихся в нем переменных. Если вы хотите иметь возможность десериализовать это в другом файле, объекте класса 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() также позволяет вам сериализовать только подмножество свойств объекта.
0 комментариев