我正在阅读关于PHP的序列化/反序列化概念。我想知道它们是如何存储在filesystem / db中的。我猜它是二进制格式。但是,我想知道整个班级是如何存储的?我知道数据成员中的数据可以存储,但方法是如何存储的?
我的意思是,PHP如何知道在someFunc()
函数中编写的代码是什么?
$obj = new ClassName();
$obj->someFunc();
$serial = serialize($obj);
$unserialobj = unserialize($serial);
$unserialobj->someFunc();
PHP可以知道第2行要做什么,但它知道如何在第5行(这是一个非序列化的对象)做什么?它是否也保存了代码?
答案 0 :(得分:8)
在序列化对象时,PHP仅存储对象的当前状态,即其属性值。它没有序列化它的方法。在反序列化时,需要在内存中加载相应的类。 PHP将从序列化字符串中恢复对象的状态,并从同名的类中获取其余信息(结构和方法)。
答案 1 :(得分:5)
PHP可以知道第2行要做什么,但它知道如何在第5行(这是一个非序列化的对象)做什么?它也保存了代码吗?
是的,serialize()
将保存有关此对象所属的类的信息及其状态,因此当您反序列化时,您将获得该类的实例,在本例中为{{ 1}}。
答案 2 :(得分: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 。
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方法将此字符串传递给另一个页面。
注意:我们可以将这个字符串一页传递到另一个页面,使用各种方法,比如使用session,我们可以保存到DB中并获取另一个页面,保存到文本文件中。
我们将在另一个文件名上反序列化此对象是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请求后反序列化此对象。对象将在其内存中保留所有赋值。