7

我正在阅读有关 PHP 的序列化/反序列化概念的信息。我想知道它们是如何存储在文件系统/数据库中的。我猜它是二进制格式。但是,我想知道整个班级是如何存储的?我知道可以存储数据成员中的数据,但是方法是如何存储的?

我的意思是,PHP 怎么知道 say, 函数里面写了什么代码someFunc()

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

PHP 可以知道在第 2 行做什么,但它如何知道在第 5 行做什么,这是一个未序列化的对象?它是否也保存代码?

4

3 回答 3

11

当序列化一个对象时,PHP 只存储对象的当前状态,即它的属性值。它不序列化它的方法。反序列化时需要将对应的类加载到内存中。PHP 将从序列化的字符串中恢复对象的状态,并从同名的类中获取其余信息(结构和方法)。

于 2011-10-24T09:17:16.137 回答
6

PHP 可以知道在第 2 行做什么,但它如何知道在第 5 行做什么,这是一个未序列化的对象?它也保存代码吗?

是的,serialize()将保存有关该对象是其实例的类的信息及其状态,因此当您反序列化时,您将获得该类的一个实例,在本例中为ClassName.

于 2011-10-24T09:13:38.647 回答
0

这是理解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 的类。
一个.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 的赋值仍然在 object 的内存中。如果我们在多次 http 请求后反序列化这个对象。对象将在其内存中保留所有分配值。

于 2014-07-25T13:05:21.193 回答