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

4

3 回答 3

2

Foo 的构造函数调用 Bar 的构造函数,后者调用 Foo 的构造函数,后者调用 Bar 的构造函数……你明白了。100 次后它会告诉你它很头晕。不要创建这样的循环引用。

于 2012-06-10T08:33:33.977 回答
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();
于 2012-06-10T09:39:51.797 回答
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();
于 2012-06-10T19:00:19.840 回答