我最近在维基百科上读了一篇关于设计模式的文章
到目前为止,我已经这样做了,但它返回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 ...