如何在链接 类 的实例时检索祖先

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);
    }
}