【问题标题】:PHP OOP Design PatternPHP OOP 设计模式
【发布时间】:2012-05-25 07:05:40
【问题描述】:

我最近在 Wikipedia 上阅读了一篇关于 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 类来获得上述模式?这种模式的名称是什么?也请给我一个链接,我可以从中学习。

非常感谢,

【问题讨论】:

  • 阅读有关设计模式的文章到底是如何将您引向这个怪物的?我认为您需要阅读 en.wikipedia.org/wiki/Anti-pattern 下一个。
  • 这个模式叫什么名字?我很好奇,真的
  • 仅将维基百科用于首次条目研究。然后在你发现它是正确的主题之后,获取一篇文章所依据的书籍。

标签: php oop class design-patterns


【解决方案1】:

考虑分别创建 Aa 和 Bb 并使用 Dependency Injection,这样每个类都会引用另一个类。不过,您应该确保这两个类不会太紧密地耦合。

cmets中提到的Gang of Four (GoF) Design patterns书是一本不错的书,但是Head First Design Patterns对于初学者来说更容易一些(也很有趣)。

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

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 ...

【讨论】:

  • 我同意。对于这样的事情,依赖注入是你想要的。
  • 顺便说一句,进一步阅读:en.wikipedia.org/wiki/Inversion_of_control。如果您想了解(真实)模式,请阅读 de Gof
  • @Brady:谢谢,你介意给我看一个示例代码吗? :-)
  • @naticap,依赖注入是一种在对象上使用 setter 的奇特方式。我将添加一个小例子。
猜你喜欢
  • 1970-01-01
  • 2014-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-11
  • 2021-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多