【问题标题】:__sleep() and superclass properties [closed]__sleep() 和超类属性
【发布时间】:2011-07-08 14:51:18
【问题描述】:

给定两个类:

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,只是我无法理解 � 是什么。

【问题讨论】:

    标签: php oop serialization sleep


    【解决方案1】:

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

    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;
       }
    }
    

    【讨论】:

    • @Francisc 任何时候你需要修改一个父类在子类中的返回值,从父类获取它。
    • 是的,唯一让我感到震惊的是,如果我没有定义 __sleep() 函数,我会在结果字符串中获得私有属性,其值为�A�prop1。如果我定义了 __sleep() 函数,这些属性将为 NULL。
    • 其中�A� 是超类名称。
    • @Francisc 您可以使用它来返回对象的所有变量,甚至是其超类中的私有变量:return array_keys((array)$this );
    【解决方案2】:

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

    protected $prop1;
    

    来自manual

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

    【讨论】:

    • 他们继承了。它们只是对派生代码不可见。
    • @Tomalak Geret'kal:谢谢。答案已更新。
    • 如果我没有在 B 序列化中定义一个 _sleep() 函数,它会按预期工作。
    • 另外,我并没有尝试直接访问私有属性,这是一个简化的示例,而是从超类调用一个方法。
    【解决方案3】:

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

    【讨论】:

    • 是的。它只是对派生代码不可见。
    • @Tomalak +`。我已经编辑了措辞以使其更好。
    • 不,我没有。查看编辑。
    猜你喜欢
    • 2021-03-13
    • 1970-01-01
    • 1970-01-01
    • 2014-09-15
    • 1970-01-01
    • 2016-10-18
    • 2013-12-12
    • 2012-03-23
    • 1970-01-01
    相关资源
    最近更新 更多