如何在链接 类 的实例时检索祖先
How to retrieve ancestor while chaining instances of classes
我正在 PHP 中开发一个应用程序,其中(jQuery-like)风格的链接方法非常方便。我不是在谈论继承链,而是在谈论 classes 实例的分类法,它们在彼此内部 'embedded'。现在我想知道如何从较低级别引用较高级别的实例。
这听起来很抽象,让我举个例子。假设我想在 PHP 中写一本书(proze)(只是为了争论)。如果我能这样编码就很方便了
$myBestseller = new Book();
$myBestseller
->setAuthor("Jean-Saul Partre")
->addChapter()
->addParagraph("How the Rabit lost its wings.")
->addWords("On a beautiful wintes day, the rabit flew over the … ")
->addWords("Bla bla")
->addWords("Bla bla");
到目前为止,我已经开始工作了。 (我应该包括实际的 class 定义吗?)现在如果我想引用层次结构中更高的 object 的 属性 怎么办?假设我想在章节标题中包含作者的姓名:
$myBestseller = new Book();
$myBestseller
->setAuthor("Jean-Saul Partre")
->addChapter()
->addParagrapWithAuthor("How "," fell out of the window.");
->addWords("Bla bla")
->addWords("Bla bla")
->addWords("Bla bla")
var_dump($myBestseller);
让我们在这里也添加第 class 章的定义:
class Chapter{
private $_paragraphs = array();
public function addParagraph($title){
return $this->_pages[] = new Paragraph($title);
}
public function addParagrapWithAuthor($prefix, $suffix){
$author = "Ideo Gram";
return $this->_pages[] = new Paragraph($prefix.$author.$suffix);
}
}
所以,我想使用作者的定义而不是 $author = "Ideo Gram"书。此代码的标题为
How Ideo Gram fell out of the window
相反,我想说
How Jean-Saul Patre fell out of the window
这能做到吗?到目前为止,我找到的唯一解决方案是传递对后代 'under the table' 的引用,但这感觉就像污染了 classes.
也许答案很直接,但我找不到。我可能不知道正确的条款。 ::parent,例如,适用于扩展 classes.
没有魔法。如果您需要 2 个实体之间的双向关系,它们需要相互引用。
所以您的方法 addChapter
可以做到这一点 :
public function addChapter() {
return $this->chapters[] = new Chapter($this);
}
所以你的章节变成了:
class Chapter {
protected $book;
public function __construct(Book $book) {
$this->book = $book;
}
....
public function addParagrapWithAuthor($prefix, $suffix){
$author = $this->book->getAuthor()->getFullName();
return $this->_pages[] = new Paragraph($prefix.$author.$suffix);
}
}
我正在 PHP 中开发一个应用程序,其中(jQuery-like)风格的链接方法非常方便。我不是在谈论继承链,而是在谈论 classes 实例的分类法,它们在彼此内部 'embedded'。现在我想知道如何从较低级别引用较高级别的实例。
这听起来很抽象,让我举个例子。假设我想在 PHP 中写一本书(proze)(只是为了争论)。如果我能这样编码就很方便了
$myBestseller = new Book();
$myBestseller
->setAuthor("Jean-Saul Partre")
->addChapter()
->addParagraph("How the Rabit lost its wings.")
->addWords("On a beautiful wintes day, the rabit flew over the … ")
->addWords("Bla bla")
->addWords("Bla bla");
到目前为止,我已经开始工作了。 (我应该包括实际的 class 定义吗?)现在如果我想引用层次结构中更高的 object 的 属性 怎么办?假设我想在章节标题中包含作者的姓名:
$myBestseller = new Book();
$myBestseller
->setAuthor("Jean-Saul Partre")
->addChapter()
->addParagrapWithAuthor("How "," fell out of the window.");
->addWords("Bla bla")
->addWords("Bla bla")
->addWords("Bla bla")
var_dump($myBestseller);
让我们在这里也添加第 class 章的定义:
class Chapter{
private $_paragraphs = array();
public function addParagraph($title){
return $this->_pages[] = new Paragraph($title);
}
public function addParagrapWithAuthor($prefix, $suffix){
$author = "Ideo Gram";
return $this->_pages[] = new Paragraph($prefix.$author.$suffix);
}
}
所以,我想使用作者的定义而不是 $author = "Ideo Gram"书。此代码的标题为
How Ideo Gram fell out of the window
相反,我想说
How Jean-Saul Patre fell out of the window
这能做到吗?到目前为止,我找到的唯一解决方案是传递对后代 'under the table' 的引用,但这感觉就像污染了 classes.
也许答案很直接,但我找不到。我可能不知道正确的条款。 ::parent,例如,适用于扩展 classes.
没有魔法。如果您需要 2 个实体之间的双向关系,它们需要相互引用。
所以您的方法 addChapter
可以做到这一点 :
public function addChapter() {
return $this->chapters[] = new Chapter($this);
}
所以你的章节变成了:
class Chapter {
protected $book;
public function __construct(Book $book) {
$this->book = $book;
}
....
public function addParagrapWithAuthor($prefix, $suffix){
$author = $this->book->getAuthor()->getFullName();
return $this->_pages[] = new Paragraph($prefix.$author.$suffix);
}
}