从子类访问父类的属性

2022-08-30 20:34:59

请参阅以下示例 (PHP)

class Parent
{ 
  protected $_property;
  protected $_anotherP;

  public function __construct($var)
  {
    $this->_property = $var;
    $this->someMethod();  #Sets $_anotherP
  }

  protected function someMethod()
  ...
}

class Child extends Parent
{
  protected $parent;

  public function __construct($parent)
  {
    $this->parent = $parent;
  }

  private function myMethod()
  {
    return $this->parent->_anotherP;  #Note this line
  }
}

我是OOP的新手,有点无知。

在这里访问父属性,我正在使用该类的实例,这似乎是错误的:S(不需要成为我的孩子)。有没有一种简单的方法,这样我就可以将父属性与子属性同步,并且可以直接访问$this->otherP,而不必使用$this->parent->otherP?


答案 1

当类扩展类时,类中或类中的每个属性和方法都将被类视为在类中定义 , 反之亦然。ChildParentpublicprotectedParentChildChild

当类该类时,它可以被看作是父级 - 这意味着具有的属性,除非它以另一种方式重新定义这些属性。ChildextendsParentChildParent

(顺便说一句,请注意,在PHP中,“parent”是一个保留关键字 - 这意味着你不能用这个名字命名一个类)


下面是一个“父”类的快速示例:

class MyParent {
    protected $data;
    public function __construct() {
        $this->someMethodInTheParentClass();
    }
    protected function someMethodInTheParentClass() {
        $this->data = 123456;
    }
}

这是“儿童”类:

class Child extends MyParent {
    public function __construct() {
        parent::__construct();
    }
    public function getData() {
        return $this->data; // will return the $data property 
                            // that's defined in the MyParent class
    }
}

这可以这样使用:

$a = new Child();
var_dump($a->getData());

您将获得输出:

int 123456

这意味着在类中定义并在同一类的方法中初始化的属性可由该类访问,就好像它是自己的一样。$dataMyParentMyParentChild


为了使事情变得简单:因为“是一个”,它不需要保留一个指针...本身 ;-)ChildMyParent


答案 2

这可以为您节省几个小时的搜索时间。

请记住:子类仅继承父类中定义的属性...因此,如果您使用 Parent 类实例化对象,然后用数据填充它,则此数据在您的子类中将不可用...

这当然是显而易见的,但我猜其他人可能会遇到同样的问题。

一个超级简单的解决方案是不扩展任何东西,只需通过构造函数将父类的$object传递到子类中即可。这样,您就可以访问父类生成的对象的所有属性和方法

class child {

    public parentObject;

    public function __construct($parentObject) {
        $this->parentObject = $parentObject;
    }

}

如果您的$parentObject具有公共属性$name,则可以使用如下函数在子类中访问它:

public function print_name() {
    echo $this->parentObject->name;
}

推荐