1

我最近在 Wikipedia 上阅读了一篇关于设计模式的文章

到目前为止,我已经这样做了,但它返回了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 并使用依赖注入,这样每个类都可以引用另一个类。不过,您应该确保这两个类不是太紧耦合。

评论中提到的四人组 (GoF) 设计模式书是一本不错的书,但Head First Design Patterns对初学者来说更容易一些(也很有趣)。

这是一个例子。请注意,在 PHP 中有更好的方法来设置属性,我放置了一个 setter 函数只是为了明确。有关更多信息,请参阅此问题

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 回答