【发布时间】:2011-07-04 11:50:52
【问题描述】:
PHP 参考手册说,当序列化一个对象时,方法不会被保存。 (参见http://www.php.net/manual/en/language.oop5.serialization.php,第 1 段)。
但是,手册中给出的第一个示例显示了一个方法被序列化,然后被反序列化并使用。
这不是矛盾吗?我错过了什么吗?
【问题讨论】:
标签: php serialization
PHP 参考手册说,当序列化一个对象时,方法不会被保存。 (参见http://www.php.net/manual/en/language.oop5.serialization.php,第 1 段)。
但是,手册中给出的第一个示例显示了一个方法被序列化,然后被反序列化并使用。
这不是矛盾吗?我错过了什么吗?
【问题讨论】:
标签: php serialization
我必须说,在第一个示例中,我没有看到方法在哪里被序列化。序列化时没有方法被序列化,只有类名和属性。如果您查看序列化数据,您可以看到这一点
$ser = serialize($object);
var_dump($ser);
您会注意到,没有提到任何方法。但是,如果您反序列化一个对象,它会由类名重新创建。或者换句话说:您将获得一个新对象,但具有您之前序列化的值。
通常这并不像听起来那么重要,因为通常序列化/非序列化对象的行为应该相同。
// serialize
class A {
public $a = null;
public function test () {
echo "Hello";
}
}
$a = new A;
echo $a->test(); // "Hello"
$x = serialize($a);
// unserialize (somewhere else)
class A {
public $a = null;
public function test () {
echo "World";
}
}
$a = unserialize($x);
echo $a->test(); // "World"
这里的序列化程序使用了一个“错误”的类,并且输出与预期的不同。只要您确保没有类名冲突,您通常不需要考虑它。
【讨论】:
方法没有序列化,但是对象所属的类是:
不会保存对象中的方法,只保存类名。
因此,当您反序列化时,您将获得同一类的实例,因此您可以在该未序列化实例上调用方法,因为该方法是类定义的一部分,而不是对象本身的成员。这当然假设您在反序列化时具有完全相同的类定义:
为了能够 unserialize() 一个对象,需要定义该对象的类。
【讨论】:
($a === unserialize(serialize($a))) === false))