РЕДАКТИРОВАТЬ: По просьбе @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
класс очень важен. Я также хотел бы повторно использовать эту модель (с некоторыми очевидными изменениями) на любых сайтах, которые я разработал в будущем, поэтому мне действительно нужно знать, что я делаю здесь неправильно! Еще раз спасибо 🙂
Оказывается, я просто неправильно создал экземпляры дочерних объектов, скопировав экземпляры родительских объектов и тупо забыв изменить WebsitePage
в WebsiteServicePage
! Хотя мне удалось не забыть сделать это, когда я написал вопрос! шлепает по лбу
Большое, большое спасибо тем, кто пытался помочь в комментариях; если бы не ваши мудрые слова (особенно @ hakre’s), я бы этого не понял!
Других решений пока нет …