Я разрабатываю приложение на 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, например, работает с расширенными классами.
Там нет магии. Если вам нужны двунаправленные отношения между двумя сущностями, они должны ссылаться друг на друга.
Итак, ваш метод 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);
}
}
Других решений пока нет …