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!ます。私が欲しいのは、まさにこれですが、もちろん異なるコードでエラーはありません。

私が欲しいのは、インスタンスがすでに作成されていることを知る1つの方法であり、循環参照を避けて、同じオブジェクトのインスタンスをこれ以上許可しないことです。

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 に答える