Как получить предка при цепочке экземпляров классов

Я разрабатываю приложение на PHP, в котором (jQuery-подобный) стиль методов сцепления чрезвычайно удобен. Я говорю не о цепочках наследования, а о таксономии экземпляров классов, которые «встроены» друг в друга. Теперь мне интересно, как я могу ссылаться на экземпляр более высокого уровня с более низкого уровня.

Все это звучит очень абстрактно, поэтому позвольте мне привести пример. Допустим, я хочу написать книгу (прозу) на PHP (просто для аргументации). Это очень удобно, если бы я мог написать это как

$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");

До сих пор я получил это работает. (Должен ли я включать фактические определения классов?) Что теперь, если я хотел бы сослаться на свойство объекта выше в иерархии? Допустим, я бы хотел включить имя автора в заголовок главы:

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

Давайте просто добавим здесь определение класса Chapter:

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 = «Идео Грам» Я хотел бы использовать определение автора книги. Заголовок с этим кодом будет

Как Идео Грам выпал из окна

Вместо этого я хотел бы сказать,

Как Жан-Сол Патр выпал из окна

Можно ли это сделать? Единственное решение, которое я нашел, это передача ссылки на потомков «под столом», но это похоже на загрязнение классов.

Может быть, ответ очень прямой, но я не могу его найти. Возможно, я не знаю правильных терминов. :: parent, например, работает с расширенными классами.

3

Решение

Там нет магии. Если вам нужны двунаправленные отношения между двумя сущностями, они должны ссылаться друг на друга.

Итак, ваш метод 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);
}
}
2

Другие решения

Других решений пока нет …