Говорят, мешать HTML и PHP это плохо, но без этого очень сложно, — во многих CMS нет-нет да впихнут какой-нибудь span или div в постраничную навигацию. А иначе как? Создавать отдельный файл themes/default/pagelinks.php ради 10 байт кода, ради одного тэга? Ради того, чтобы было Ъ и не мешать код? Не смешите.
В моём случае, не вижу смысла вообще создавать темы оформления ради _каждого_ отдельного элемента сайта. Или надо? Статья, форма отправки комментария, комментарий (и предположительно их много): что ж теперь, на каждый элемент будет обращение к ФС за шаблоном? Скорости это не прибавит, знаете ли.
Учитывая, что делать темы оформления не планируется (код пишется под один дизайн), я не нашёл другого способа, кроме как «вкомпилить» шаблоны в PHP, но чтобы, так сказать, «не мешать с HTML», логически постарался их отделить в HEREDOC. Это нормально?
Теперь я осваиваю ООП, т.к. сказали, что мой код говно. Пытаюсь исправиться. В ООП всё есть «объект», каждый элемент сайта становится объектом. Ну ок.
Задача простая — нарисовать страничку, применив кучу объектов.
new Core(); // запускаем приложение
class Core {
public function __construct() {
$comment = new Comment();
$comment_form = $comment->HTMLForm(); // рисуем форму для отправки
$page = new Page();
$page_html = $page->HTML(); // берём шаблон страницы по-умолчанию
$template = new Template($page_html); // создаём шаблон из страницы
$template->set('title', 'Comments');
$template->set('content', $comment_form); // добавляем форму на страницу
echo $template->show();
}
}
class Page {
public function HTML() {
return <<<HEREDOC
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>$title</title>
</head>
<body>
$content
</body>
</html>
HEREDOC;
}
}
class Comment {
public function HTMLForm($options = array('action' => '/')) {
extract($options);
return <<<HEREDOC
<form action="$action" method="POST">
<textarea class="edits" wrap="soft" rows="5" name="message"></textarea><br>
<input class="edits" type="submit" value="add comment">
</form>
HEREDOC;
}
}
class Template {
public $theme = '';
public $array = array();
public function __construct($theme, $array = array()) {
$this->theme = $theme;
$this->array = $array;
}
public function __destruct() {
}
public function set($key, $value) {
$this->array[$key] = $value;
}
public function get($key) {
return $this->array[$key];
}
public function show() {
extract($this->array);
return $this->theme;
}
}
Ведь как-то так и должно выглядить ООП? Очень прошу тыкнуть носом, где неправильно.
Идея в том, чтобы писать HTML-шаблон прямо внутри каждого элемента, каждого объекта. Чтобы исключить создание файлов-шаблонов и обращение к ним в ФС, а так же не плодить кучу мелких файлов размером десятки байт. Есть идеи лучше?
class Page {
public function HTML() {
return <<<HEREDOC
HEREDOC;
}
}
class Article {
public function HTMLArticle() {
return <<<HEREDOC
HEREDOC;
}
}
class Comment {
public function HTMLForm() {
return <<<HEREDOC
HEREDOC;
}
public function HTMLComment() {
return <<<HEREDOC
HEREDOC;
}
}
Как-то так. Самый главный вопрос — как эти шаблоны лучше распарсить? Делать return eval($this->theme);
в классе new Template()->show();
кажется не лучшей идеей. В случае с файлами, конечно, делалось бы ob_start(); include $this->theme; return ob_get_clean();
, но пугает множественное обращение к ФС и мелким файлам.
В идеале, конечно, хочу написать _весь_ проект в одном единственном PHP-файле, поэтому плодить сторонние файлы крайне не желательно, в т.ч. шаблоны.
Буду рад, если поделитесь полезными ссылками по теме ООП в PHP.