PHP参考手册说,序列化一个对象时,这些方法将不会被保存。 (见http://www.php.net/manual/en/language.oop5.serialization.php,第1段)。PHP是否序列化对象方法?
但是,手册中给出的第一个示例显示了一个序列化的方法,然后进行了非序列化和使用。
这不是矛盾吗?我错过了什么吗?
PHP参考手册说,序列化一个对象时,这些方法将不会被保存。 (见http://www.php.net/manual/en/language.oop5.serialization.php,第1段)。PHP是否序列化对象方法?
但是,手册中给出的第一个示例显示了一个序列化的方法,然后进行了非序列化和使用。
这不是矛盾吗?我错过了什么吗?
我必须说,我没有看到方法在第一个例子中序列化的地方。序列化时,没有方法被序列化,只有类名和属性。你可以看到这个,如果你看看序列化的数据
$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"
这里的串行化使用“错误”类和输出是不同的,比预期的一个。只要你确定没有类名冲突,你通常不需要考虑它。
的方法没有串行化,但其中的对象是其成员的类是:
中的对象的方法将不被保存,只有类的名称。
因此,当你反序列化,则获得相同的类的一个实例,这样就可以调用在该序列化的实例的方法中,作为方法是类定义的一部分,而不是对象本身的一个成员。这当然假定您在解序列化时具有完全相同的类定义:
为了能够反序列化()对象,需要定义该对象的类。
这不是一个新鲜的新实例。刚刚返回到序列化该对象的阶段 –
@Shakti:这是一个新实例。你是对的,那就是重建对象的预序列化状态,但是它重建在新实例之上。因为(例如)你可以从文件中读/写序列化的对象,所以在不同的调用过程中没有办法保存实例。 ('($ a === unserialize(serialize($ a)))=== false)') – KingCrunch
感谢KingCrunch,真棒解释。阅读参考手册时,我做了一些不正确的假设。尽管你的解释很清楚。 –