2011-12-02 37 views
1

这似乎很简单,但我没有得到它现在相当长的一段做...如何在父类的属性中存储子类?

class Main 
{ 
    public $sub1; 
    public $sub2; 

    public function __construct() 
    { 
     $this->sub1 = new Sub1(); 
     $this->sub2 = new Sub2(); 
    } 
} 

class Sub1 extends Main 
{ 
    public function __construct() {} 

    public function helloWorld() 
    { 
     echo "hello world"; 
    } 
} 

class Sub2 extends Main 
{ 
    public function __construct() 
    { 
     $this->sub1->helloWorld(); 
    } 
} 

new Main(); 

代码的结果是致命错误:调用一个成员函数的helloWorld()。但为什么?我不明白为什么当我尝试从sub2访问它时,Main类的sub1属性为NULL。任何人都可以向我解释吗?我在OOP编程方面做了些什么基本错误的事情?我伤害了任何概念吗?有没有更好的解决方案?

此致敬礼!

回答

1

您在Sub1和Sub2中都覆盖了Main的__construct(),这意味着Main的构造不会被调用。即使你在Sub1和Sub2的结构中调用parent::__construct(),你也会得到一个无限循环,因为Main的构造正在初始化这两个subs。

编辑:既然你想分享的对象,这里有一对夫妇做题,可以帮助:
Sharing objects between PHP classes
How to create an object in a parent class shared by its children classes?

+0

谢谢。现在我甚至明白了为什么在静态上下文中调用构造函数(: –

0

,你怎么能指望你不要是致命的。您尝试访问$ Sub1而没有它的实例。你需要了解的是对象的实例化。当你正在写一个类时,它只是定义。你需要一个实例来处理。

0

我认为你可以解释你想解决什么问题,显然你不能这样做,但我猜你的问题不应该取决于你的解决方案。 所以,也许有人可以给你一个很好的答案。

相关问题