【问题标题】:PHP Get parent class variables from child class constructed in the parent constructorPHP从父构造函数中构造的子类获取父类变量
【发布时间】:2014-12-16 10:30:16
【问题描述】:

用下面的代码sn-p,为什么$this->foo在B子类构造函数中返回NULL?根据我的阅读,我的印象是子类继承了它的所有父变量和方法

$a = new A();

class A {
    protected $foo;

    public function __construct() {
        $this->foo = "Hello World";

        $b = new B();
    }
}

class B extends A {
    public function __construct() {
        var_dump($this->foo);
    }
}

this question 的选定答案似乎表明$this->foo 应该是可访问的。

是因为 B 是在其父类中构造的吗?如果是这种情况,如何访问子类中的变量?

【问题讨论】:

  • 你能解释一下为什么你需要你的类在它的构造函数中创建它自己的实例吗?在任何情况下,我都看不出这是个好主意。
  • 我并不特别需要类来创建自身的实例,但是当父类被实例化时,我需要实例化另一个类来做其他事情,但可以访问第一个类中设置的变量
  • 只要您创建实例的类不是创建它的类的派生类,您就可以使用parent::__construct() 做到这一点。

标签: php oop inheritance


【解决方案1】:

你正在做new A(),然后你正在做new B()。您有两个完全独立的对象实例。在A 的构造函数中发生一个实例化并不重要,这完全无关紧要。 B 扩展 A 也没关系。您有两个独立的对象,并且对象实例不会隐式共享数据,这似乎是您所期望的。

由于B 的构造函数覆盖了其父构造函数,它也不会执行A 的任何代码,因此当您实例化一个新的B 时基本上什么都不会发生。

【讨论】:

  • 谢谢。是否有首选方法/最佳实践来做我想做的事情?即在父类中设置一些变量,实例化一个子类并访问这些变量
  • Jein... 您的问题很可能是您不知道如何将面向对象的方法应用于您的问题。做你想做的事不是不可能,但它很可能是你试图在那里解决的任何问题的错误解决方案。对于您给出的通用示例,很难具体说明任何内容。我建议您发布一个新问题,概述您尝试在 OOP 中解决的问题。
  • 考虑到这个问题得到了反对票,我不愿意发布一个新问题,但我很欣赏这个解释,现在明白为什么我试图做的事情没有奏效,所以我会接受这个回答
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-16
  • 1970-01-01
  • 2010-12-06
相关资源
最近更新 更多