__sleep() and superclass properties [closed]

2019-09-21 08:21发布

Given two classes:

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

That will only serialize the value of prop2 as it's a direct property of class B.

How can I get it to output the inherited prop1 from superclass A?

EDIT:
Not defining the __sleep() will show the private properties in the serialized string without setting them to protected. They look something like �A�prop1, only I cannot get what the � is.

3条回答
乱世女痞
2楼-- · 2019-09-21 08:44

A private member is not visible by any code in child classes. You will need protected.

查看更多
Luminary・发光体
3楼-- · 2019-09-21 08:46

Explicitly call the parent class's function and append the result:

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;
   }
}
查看更多
倾城 Initia
4楼-- · 2019-09-21 08:58

Private properties are not visible to child objects. You will need to change the visibility of $prop1 to protected so B can access it:

protected $prop1;

From the manual:

Members declared as private may only be accessed by the class that defines the member.

查看更多
登录 后发表回答