PHP:如何在子构造中调用父构造的私有值?

时间:2011-03-28 10:22:58

标签: php inheritance properties private construct

我希望能够在父构造函数中设置私有属性的值,并在子构造函数或方法中调用该值。

例如:

<?php


abstract class MainClass
{
    private $prop_1;
    private $prop_2;


     function __construct()
     {
            $this->prop_2 = 'this is  the "prop_2" property';
     }
}

class SubClass extends MainClass
{
    function __construct()
    {
        parent::__construct();
        $this->prop_1 = 'this is the "prop_1" property';
    }

    public function GetBothProperties()
    {
        return array($this->prop_1, $this->prop_2);
    }

}

$subclass = new SubClass();
print_r($subclass->GetBothProperties());

?>

输出:

Array
(
    [0] => this is the "prop_1" property
    [1] => 
)

但是,如果我将prop_2更改为protected,则输出将为:

Array
(
    [0] => this is the "prop_1" property
    [1] => this is  the "prop_2" property
)

我对OO和php有基本的知识,但是当prop_2private时,我无法弄清楚是什么阻止{{1}}被调用(或显示?);它不能是私人/公共/受保护的问题,因为'prop_1'是私有的,能够被调用和显示......对吗?

分配子类与父类的值是一个问题吗?

我很感激帮助理解原因。

谢谢。

4 个答案:

答案 0 :(得分:6)

无法在Child类中访问父类的私有属性,反之亦然。

你可以这样做

abstract class MainClass
{
   private $prop_1;
   private $prop_2;


   function __construct()
   {
        $this->prop_2 = 'this is  the "prop_2" property';
   }

   protected function set($name, $value)
   {
        $this->$name = $value;
   }

   protected function get($name)
   {
      return $this->$name;
   }

 }


class SubClass extends MainClass
{
    function __construct()
    {
        parent::__construct();
        $this->set('prop_1','this is the "prop_1" property');
    }

    public function GetBothProperties()
    {
        return array($this->get('prop_1'), $this->get('prop_2'));
    }

}

答案 1 :(得分:6)

如果要从子类访问父级属性,则必须使父级属性受到保护而不是私有。这样他们仍然无法进入外部。 您不能以您尝试的方式覆盖子类中父级的私有属性可见性。

答案 2 :(得分:2)

正如其他人所说,您需要将父级的属性更改为protected。但是,另一种方法是为您的父类实现get方法,允许您访问该属性,或者如果您希望能够覆盖它,则可以实现set方法。

所以,在你的父类中,你要声明:

protected function setProp1( $val ) {
  $this->prop_1 = $val;
}

protected function getProp1() {
  return $this->prop_1;
}

然后,在您的子课程中,您可以分别访问$this->setProp1("someval");$val = $this->getProp1()

答案 3 :(得分:0)

使用lambdas有一个简单的技巧,我在这里找到:https://www.reddit.com/r/PHP/comments/32x01v/access_private_properties_and_methods_in_php_7/

基本上,您使用lambda并将其绑定到实例,然后可以访问它的私有方法和属性

关于lambda调用的信息:https://www.php.net/manual/en/closure.call.php