Как работает сериализация/несериализация объектов?
Я читал о концепциях сериализации/несериализации PHP. Мне было интересно, как они хранятся в файловой системе/бд. Я предполагаю, что это в двоичном формате. Однако мне интересно, как хранится весь класс? Я понял, что данные в элементе данных могут храниться, но как хранятся методы?
Я имею в виду, как PHP узнает, какой код написан внутри функции say, someFunc()
?
$obj = new ClassName();
$obj->someFunc();
$serial = serialize($obj);
$unserialobj = unserialize($serial);
$unserialobj->someFunc();
PHP может знать, что делать в строке № 2, но как он знает, что делать в строке № 5, которая является несериализованный объект? Сохраняет ли он также код?
3 answers
PHP может знать, что делать в строке № 2, но как он знает, что делать в строке № 5, которая является несериализованным объектом? сохраняет ли он также код?
Да, serialize()
сохранит информацию о классе, экземпляром которого является этот объект, вместе с его состоянием, поэтому при несериализации вы получите экземпляр этого класса, который в данном случае является ClassName
.
При сериализации объекта PHP сохраняет только текущее состояние объекта, т. е. значения его свойств. Он не сериализует свои методы. Соответствующий класс должен быть загружен в память во время несериализации. PHP восстановит состояние объекта из сериализованной строки и возьмет остальную информацию (структуру и методы) из одноименного класса.
Это простой пример для понимания сериализации и несериализации объекта в php. мы скрываем объект в строку с помощью сериализации и используем текущее состояние этого объекта (с присвоением значений) после несериализации на другой странице..
C.php
<?php class A {
public $one ;
public function A($val) {
$this->one=$val;
// echo $this->one;
}
function display(){
echo $this->one;
}
}
?>
C.php файл имеет класс с именем A.
a.php
<?
require_once "c.php";
$ob= new A('by Pankaj Raghuwanshi : Object Searlization.');
$ob->display(); // Output is: by Pankaj Raghuwanshi : Object Searlization.
$s = serialize($ob);
// echo $s will show a string of an object
?>
<br><A href='b.php?s=<?=$s;?>'>B-file</a>
Мы сериализуем этот объект, преобразуем его в строку и передаем эту строку на другую страницу методом get.
Примечание: мы можем передать эту строку с одной страницы на другую страницу с помощью различных методов, таких как использование сеанса, мы можем сохранить в БД и получить другую страницу, сохранить в текстовый файл.
Мы отключим сериализацию этого объекта на другое имя файла b.php
B.php
<?
require_once "c.php";
$ob = unserialize($_GET[s]);
$ob->display();
// Output is: by Pankaj Raghuwanshi : Object Searlization.
?>
После несериализации объект, демонстрирующий такое же поведение, как a.php файл и присвоить значение a.php все еще находится в памяти объекта. если мы будем отменять сериализацию этого объекта после многих http-запросов. Объект сохранит все присвоенные значения в своих память.