2

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

例如:

<?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_2protected,输出将是:

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

我有OO 和 php 的基本知识,但我不知道是什么阻止prop_2了它被调用(或显示?)private;它不能是私人/公共/受保护的问题,因为“prop_1”是私人的,可以被调用和显示......对吗?

这是在子类与父类中分配值的问题吗?

我会很感激帮助理解为什么。

谢谢你。

4

4 回答 4

6

父类的私有属性不能在子类中访问,反之亦然。

你可以这样做

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

}
于 2011-03-28T10:26:39.880 回答
6

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

于 2011-03-28T10:29:27.320 回答
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()

于 2011-03-28T10:38:23.580 回答
0

有一个简单的技巧可以用于 lambda,我在这里找到: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

于 2019-10-21T09:12:47.637 回答