__sleep()和超类属性

时间:2011-07-08 14:51:19

标签: php oop serialization sleep

给出两个类:

class A
{
   private $prop1;
}
class B extends A
{
   private $prop2;
   public function __sleep()
   {
      return array('prop1','prop2');
   }
}

这只会序列化prop2的值,因为它是B类的直接属性。

如何从超类A输出继承的prop1

修改
未定义__sleep()将在序列化字符串中显示private属性,而不将其设置为protected。它们看起来像�A�prop1,只有我无法得到 是什么。

3 个答案:

答案 0 :(得分:10)

显式调用父类的函数并附加结果:

class A
{
   private $prop1;
   public function __sleep()
   {
      return array('prop1');
   }
}

class B extends A
{
   private $prop2;

   public function __sleep()
   {
      $arr = parent::__sleep();
      array_push( $arr, 'prop2' );
      return $arr;
   }
}

答案 1 :(得分:2)

子对象不可见私有属性。您需要将$prop1的可见性更改为protected,以便B可以访问它:

protected $prop1;

来自manual

  

声明为私有的成员只能由定义该成员的类访问。

答案 2 :(得分:0)

子类中的任何代码都不会看到私有成员。您需要protected