1

最近、ウィキペディアでデザインパターンに関する記事を読みました。

これまでにこれを実行しましたが、Fatal error: Maximum function nesting level of '100' reached, aborting!

論理的には、ネストエラーが返されることはわかっていますが、最善の手順がわかりません。

class Main {
    $this->Aa = new Aa;
    $this->Bb = new Bb;
    $this->Cc = new Cc;
    }
class Aa extends Main {
    function blahA() {
        // blah blah
        }
    function testA() {
        $ret[] = $this->blahA(); // Call inside class
        $ret[] = $this->Bb->blahB(); // Call outside class
        $ret[] = $this->Cc->blahC(); // Call outside class
        return $ret;
        }
    }
class Bb extends Main {
    function blahB() {
        // blah blah
        }
    function testB() {
        $ret[] = $this->blahB(); // Call inside class
        $ret[] = $this->Aa->blahA(); // Call outside class
        $ret[] = $this->Cc->blahC(); // Call outside class
        return $ret;
        }
    }
class Cc extends Main {
    function blahC() {
        // blah blah
        }
    function testC() {
        $ret[] = $this->blahC(); // Call inside class
        $ret[] = $this->Aa->blahA(); // Call outside class
        $ret[] = $this->Bb->blahB(); // Call outside class
        return $ret;
        }
    }

Aa基本的に、クラスのメソッドをクラスで再利用できるようにするため、Bbまたはその逆のために、クラスの設計を管理したいと思います。私は興味があります、上記の私のクラスのような関係を構築する方法、extends上記のパターンを取得するためのクラスへの方法は?そして、このパターンの名前は何ですか?また、私が学ぶことができるリンクを教えてください。

どうもありがとう、

4

1 に答える 1

4

Aa と Bb を別々に作成し、依存性注入を使用して、各クラスが他のクラスへの参照を持つようにすることを検討してください。ただし、2 つのクラスが密結合しすぎないようにする必要があります。

コメントで言及されているギャング オブ フォー (GoF) デザイン パターンの本は良い本ですが、Head First Design Patternsは初心者にとって少し簡単です (これもとても楽しいです)。

ここに例があります。PHP でプロパティを設定するより良い方法があることに注意してください。ここでは明示的にセッター関数を追加しました。詳細については、この質問を参照してください。

class Main {
    $this->Aa = new Aa;
    $this->Bb = new Bb;
    $this->Cc = new Cc;

    // Can use properties instead of setters
    $this->Aa->setB(Bb);
    $this->Aa->setC(Cc);

    $this->Bb->setA(Aa);
    $this->Bb->setC(Cc);

    $this->Bb->setA(Aa);
    $this->Bb->setC(Bb);
    }

class Aa {                // No need to extend Main, right?
    function blahA() {
        // blah blah
        }
    // Dependency injection, Bb is now a member of this class
    // Consider doing this with PHP properties instead
    // Using setter function to be more explicit
    function setB(Bb b) {
        this->Bb = b;
        }
    // Dependency injection, Cc is now a member of this class
    // Consider doing this with PHP properties instead
    // Using setter function to be more explicit
    function setC(Cc c) {
        this->Cc = c;
        }
    function testA() {
        $ret[] = $this->blahA(); // Call inside class
        $ret[] = $this->Bb->blahB(); // Call outside class
        $ret[] = $this->Cc->blahC(); // Call outside class
        return $ret;
        }
    }
// Class Bb ...
// Class Cc ...
于 2012-05-17T17:11:41.820 に答える