PHP OOP 设计模式


PHP OOP Design Pattern

我最近在维基百科上读了一篇关于设计模式的文章

到目前为止,我已经这样做了,但它返回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类以获得超越模式?这个模式叫什么名字?也请给我一个链接,我可以从中学习。

非常感谢,

考虑分别创建 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 ...