2012-06-10 118 views
0

我有後續(樣品)代碼:多時間執行旁路

class Foo { 
    public function __construct() { 
     $this->bar = new Bar(); 
     $this->baz = new Bazr(); 
    } 
} 

class Bar extends Foo { 
    public function __construct() { 
     parent::__construct(); 

     $baz = $this->baz->alert(); 
    } 
} 

class Baz extends Foo { 
    public function __construct() { 
     parent::__construct(); 
    } 

    public function alert() { 
     echo('Hello!'); 
    } 
} 

new Foo(); 

這將產生一個Fatal error: Maximum function nesting level of '100' reached, aborting!。我想要的是,正是這一點,不同的代碼,沒有錯誤。

我想知道的一種方法是知道我的實例何時已經創建,並且不允許更多同一對象的實例,避免循環引用。

瞭解Singletom,但沒有任何工作。有什麼想法?

回答

0

實現依賴注入是解決方案:

class Foo { 
    public function __construct() { 
     $this->bar = new Bar(new Baz()); 
    } 
} 

class Bar { 
    public function __construct($baz = null) { 
     $this->baz = $baz; 
     $this->baz->alert(); 
    } 
} 

class Baz { 
    public function __construct() { 
    } 

    public function alert() { 
     echo('Hello!'); 
    } 
} 

new Foo(); 
2

Foo的構造函數調用Bar的構造函數,它調用Foo的構造函數,它調用Bar的構造函數...您明白了。經過100次,它告訴你它是頭暈。不要像這樣創建一個循環引用。

+0

是的是的,我知道的錯誤,以及如何它是occour。我想要的是一種方法來知道我的實例何時已經創建,並且不允許更多的同一對象的實例,避免循環引用。 –

+1

Richard Brightwell,感謝您的幫助,瞭解了更多關於Dependence Injection的信息,這些解決了我的問題。 –

1

我不太明白你爲什麼需要這一切?如果僅僅因爲拿到的類Foo酒吧/巴茲的方法,那麼你可以使用:

class Foo { 
    public function __construct() { 
     Bar::init(); 
    } 
} 

class Bar extends Foo { 
    public function __construct() { 
     parent::__construct(); 
    } 

    public function init() { 
     Baz::alert(); 
    } 
} 

class Baz extends Foo { 
    public function __construct() { 
     parent::__construct(); 
    } 

    public function alert() { 
     echo 'Hello!'; 
    } 
} 

new Foo(); 
+0

因爲這是一個樣本類。但是,如果我有一個獲取配置文件的類。我不希望每個擴展類再次獲取它,但是,希望它們使用已獲取數據的配置對象。 (這是許多使用案例之一) –

+0

B7ackAnge7z感謝您的幫助,瞭解了更多關於Dependence Injection的信息,這些解決了我的問題。 –