2012-06-10 2 views
0

У меня есть код последующей (пример):Multiple время выполнения обхода

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

Да да, я знаю об ошибке, и как это обычай. То, что я хочу, - это один из способов узнать, когда мой экземпляр уже создан и не позволяет больше экземпляров одного и того же объекта, избегая циклической ссылки. –

+1

Ричард Брайтвелл, спасибо за помощь, узнал больше о Dependency Injection, которая решила мою проблему. –

1

Я не совсем понимаю, зачем вам это нужно? Если только потому, чтобы получить методы Бар/Baz в классе 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 Спасибо за помощь, узнали больше о Dependency Injection, которая решила мою проблему. –