подклассы — переопределение функции дочернего класса PHP не вызывается

РЕДАКТИРОВАТЬ: По просьбе @hakre, вот упрощенная версия родительского класса. Ниже приведен полный ответ на оригинальный вопрос.

class WebsitePage {
protected $name;
protected $slug;
protected $heading;
protected $intro;
protected $content;

// constructor and other unrelated functions, including name()
// which just spits out a simple string passed into the constructor,
// and heading(), which wraps that in a <h1> tag.
...

public function slug() {
return isset($this->slug) ? $this->slug : strtolower(
str_replace(array(' ', '/'), '-', $this->name));
}

public function content() {
return isset($this->content) ? $this->
content : $this->get_template();
}

protected function get_template() {
ob_start();
include(__DIR__ . '/templates/' . (!empty($this->
slug()) ? $this->slug() : $this->name) . '.php');

$content = ob_get_contents();
ob_end_clean();

return $this->intro() . $content;
}
}

ОРИГИНАЛ: похож на этот вопрос, У меня возникают проблемы при получении наследования классов (в частности, переопределения функций), чтобы работать так, как указывает каждый ресурс PHP.

Родительский класс:

class WebsitePage {
protected $name;
protected $slug;
protected $heading;
protected $intro;
protected $content;

public function __construct($name, $slug = null, $heading = null, $intro = null, $content = null) {
$this->name = $name;
$this->slug = $slug;
$this->heading = $heading;
$this->intro = $intro;
$this->content = $content;
}

public function name() {
return $this->name;
}

public function slug() {
return isset($this->slug) ? $this->slug : strtolower(
str_replace(array(' ', '/'), '-', $this->name));
}

public function heading() {
return isset($this->heading) ? $this->
heading : "<h1>$this->name</h1>";
}

public function intro() {
return '<div class="page-intro">' . (!isset($this->intro) ? $this->
heading : "$this->heading<p>$this->intro</p>") . '</div>';
}

public function content() {
return isset($this->content) ? $this->
content : $this->get_template();
}

protected function get_template() {
ob_start();
include(__DIR__ . '/templates/' . (!empty($this->
slug()) ? $this->slug() : $this->name) . '.php');

$content = ob_get_contents();
ob_end_clean();

return $this->intro() . $content;
}
}

Детский класс:

class WebsiteServicePage extends WebsitePage {
public function __construct($name, $slug = null, $heading = null, $intro = null, $content = null) {
parent::__construct($name, $slug, $heading, $intro, $content);
}

public function slug() {
return 'our-services/' . parent::slug();
}

public function heading() {
return isset($this->heading) ? $this->
heading : "<h2>$this->name</h2>";
}
}

Конкретизация:

$servicePages = array(
new WebsiteServicePage('Tree Lopping'),
new WebsiteServicePage('Land Clearing')
...more service page instantiations
);

foreach ($servicePages as $servicePage) {
echo $servicePage->content();
}

Который на каждой итерации цикла приводит к родительскому классу content() будучи вызванным, который вызывает свой собственный get_template(), который называет свой slug() и поэтому опускает /our-services с последней страницы пули. Это означает, что get_template() не могу найти правильные файлы шаблона, так как они существуют в our-services каталог.

Я мог бы просто поместить все шаблоны в один каталог, чтобы обойти эту проблему, но я чувствую, что, должно быть, я неправильно понимаю что-то фундаментальное в наследовании классов PHP. Хотя, как упоминалось ранее, каждый ресурс PHP, который мне удалось найти, предлагал, чтобы то, что я сделал, работало!

Так что же дает? MTIA! 🙂

Постскриптум StackOverflow предлагает мне добавить еще немного не-кодового контента к моему вопросу, так что для тех, кого это волнует, это для веб-сайта, который я создаю для клиента, который ведет бизнес по рубке деревьев / лесоводству. Они предоставляют все виды услуг, связанных с деревьями, поэтому ребенок WebsiteServicePage класс очень важен. Я также хотел бы повторно использовать эту модель (с некоторыми очевидными изменениями) на любых сайтах, которые я разработал в будущем, поэтому мне действительно нужно знать, что я делаю здесь неправильно! Еще раз спасибо 🙂

-2

Решение

Оказывается, я просто неправильно создал экземпляры дочерних объектов, скопировав экземпляры родительских объектов и тупо забыв изменить WebsitePage в WebsiteServicePage! Хотя мне удалось не забыть сделать это, когда я написал вопрос! шлепает по лбу

Большое, большое спасибо тем, кто пытался помочь в комментариях; если бы не ваши мудрые слова (особенно @ hakre’s), я бы этого не понял!

1

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

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

По вопросам рекламы [email protected]