В настоящее время я работаю над API в PHP для личного использования и создал дизайн, который в значительной степени зависит от возможности задействовать полиморфизм. Я часто работаю с такими языками, как C ++, Java и Objective-C, где полиморфизм обладает большей универсальностью.
Я заметил, что PHP немного более устойчив к полиморфизму и задавался вопросом, знает ли кто-нибудь правильный синтаксис того, что я пытаюсь описать ниже:
// FIRST Create objects and store in variables
$link0 = new Link("#", "StackOverflow");
$link1 = new Link("http://www.stackoverflow.com", "StackOverflow");
$link2 = new Link("http://www.stackcareers.com", "StackCareers");
// Use
$stack_submenu = new Menu( $link0, array( $link1,$link2 ) );
...
foreach ( $stack_submenu->menuItems as $item ) {
$item->html();
}
Приведенный выше пример дает мне следующую ошибку:
Неустранимая ошибка — вызов функции-члена html () для необъекта
Я прочитал и нашел способ удалить ошибку, изменив синтаксис, однако, я ДОЛЖЕН вызывать конструкторы к объектам связи внутри массива:
// WORKS, but does not allow me to use variables in place of constructor
$submenu_mamp = new Menu($link_mamp, array( new Link("http://www.stackoverflow.com", "StackOverflow"), new Link("http://www.stackcareers.com", "StackCareers")));
Вышеописанное работает, но ради моего приложения я создаю объекты перед созданием массива. Я попытался передать по ссылке, но я получаю ту же ошибку, указанную ранее.
Есть ли способ сделать то, что я пытаюсь, или я должен напрямую вызвать конструктор внутри определения массива?
РЕДАКТИРОВАТЬ
Конструктор класса меню:
// CONSTRUCTOR
public function __construct($menuLink, $menuItems) {
// Set Properties
$this->menuLink = $menuLink;
$this->menuItems = $menuItems;
}
Задача ещё не решена.
Других решений пока нет …