PHP是否序列化对象方法



PHP参考手册说,在序列化对象时,方法将不会被保存。(请参见http://www.php.net/manual/en/language.oop5.serialization.php,第1段(。

然而,手册中给出的第一个例子显示了一种方法正在序列化,然后未序列化并使用。

这不是矛盾吗?我是不是错过了什么?

我必须说,在第一个例子中,我没有看到方法在哪里序列化。序列化时,不序列化任何方法,只序列化类名和属性。你可以看到这一点,如果你有一个串行数据

$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"

这里的序列化程序使用了一个"错误"的类,并且输出与预期的不同。只要你确保没有类名冲突,你通常不需要考虑它。

方法没有序列化,但对象所属的类是:

对象中的方法将不会保存,只保存类的名称

因此,当您取消序列化时,您将获得同一类的实例,因此您可以在该未序列化实例上调用该方法,因为该方法是类定义的一部分,而不是对象本身的成员。当然,这假设您在非序列化时具有完全相同的类定义:

为了能够取消一个对象的序列化((,需要定义该对象的类。

最新更新