多次执行旁路

时间:2012-06-10 08:24:30

标签: php constructor scope php-5.3 hierarchy

我有以下(示例)代码:

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,但是,没有任何效果。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

Foo的构造函数调用Bar的构造函数,它调用Foo的构造函数来调用Bar的构造函数......你明白了。经过100次,它告诉你它晕了。不要像那样创建循环引用。

答案 1 :(得分:1)

我不太明白为什么你需要这一切?如果只是因为在Foo类中获取Bar / Baz的方法,那么你可以使用:

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();

答案 2 :(得分: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();