Как работает сериализация/несериализация объектов?


Я читал о концепциях сериализации/несериализации PHP. Мне было интересно, как они хранятся в файловой системе/бд. Я предполагаю, что это в двоичном формате. Однако мне интересно, как хранится весь класс? Я понял, что данные в элементе данных могут храниться, но как хранятся методы?

Я имею в виду, как PHP узнает, какой код написан внутри функции say, someFunc()?

$obj = new ClassName();
$obj->someFunc();
$serial = serialize($obj);
$unserialobj = unserialize($serial);
$unserialobj->someFunc();

PHP может знать, что делать в строке № 2, но как он знает, что делать в строке № 5, которая является несериализованный объект? Сохраняет ли он также код?

Author: Maneating Koala, 2011-10-24

3 answers

PHP может знать, что делать в строке № 2, но как он знает, что делать в строке № 5, которая является несериализованным объектом? сохраняет ли он также код?

Да, serialize() сохранит информацию о классе, экземпляром которого является этот объект, вместе с его состоянием, поэтому при несериализации вы получите экземпляр этого класса, который в данном случае является ClassName.

 4
Author: BoltClock, 2011-10-24 09:13:38

При сериализации объекта PHP сохраняет только текущее состояние объекта, т. е. значения его свойств. Он не сериализует свои методы. Соответствующий класс должен быть загружен в память во время несериализации. PHP восстановит состояние объекта из сериализованной строки и возьмет остальную информацию (структуру и методы) из одноименного класса.

 7
Author: deceze, 2011-10-24 09:17:16

Это простой пример для понимания сериализации и несериализации объекта в 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-запросов. Объект сохранит все присвоенные значения в своих память.

 0
Author: PankajR, 2014-07-25 13:05:21