Сильно ли плохо подключать один и тот же файл 20 раз?

Создал объект, который представляет из себя блок, который используется на сайте от 1 до 20 раз. Раньше весь HTML у меня был в переменной класса вида этого объекта. Для того, чтобы отдать его дизайнеру-верстальщику для работы, мне потребовалось создать HTML шаблон этого блока. Теперь получается, что этот шаблон подключается в скрипт по 20 раз. Приемлимо ли такое решение?


Код, который вызывается по 20 раз:
$BlockData = $this->GetBlockData(); // Получаем данные, которые вставятся в блок
ob_start(); // Буферизуем
require('block.html'); // Загружаем шаблон, в него сразу подставляются все переменные из массива $BlockData
$BlockWithHTML = ob_get_contents(); // Сохраняем уже исполненный код в переменную
ob_end_clean(); // Очищаем буфер
return $BlockWithHTML; // Отдаем готовый HTML блока



Посоветуйте пожалуйста более красивые решения.
  • Вопрос задан
  • 5051 просмотр
Решения вопроса 1
BuriK666
@BuriK666
Компьютерный псих
Может как-то так?
function getTemplate($tpl){
  static $templates=array();
  if (!isset($templates[$tpl])){
    $templates[$tpl]=file_get_contents($tpl);
  }
  ob_start();
  eval($templates[$tpl]);
  return ob_get_clean();
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 5
DedalX
@DedalX
Web разработчик, IT бизнесмен
dpigo
@dpigo
Front-end developer
Передавать в шаблон массив и использовать циклы не пробовали? Например: www.smarty.net/docsv2/en/language.function.foreach
Ответ написан
Salvador2006
@Salvador2006 Автор вопроса
Может кому будет полезно. Время выполнения кода при 20 вызовах:

— HTML в переменной: 0.009 с
— 20 подключений шаблона: 0.012 с
— статическая переменная + eval + file_get_contents: 0.011 с

Для большего количества вызовов рекомендую решение предложенное BuriK666.

Время выполнения кода при 100 вызовах:

— HTML в переменной: 0.037 с
— 20 подключений шаблона: 0.053 с
— статическая переменная + eval + file_get_contents: 0.044 с

Я остановился на 20 require'ах. Спасибо всем за помощь!
Ответ написан
Комментировать
MTonly
@MTonly
Веб-разработчик с 2002 года
Посоветуйте пожалуйста более красивые решения.
Рассмотрите возможность использования статических шаблонов (исполняемого кода не содержащих вовсе). После первой загрузки шаблона шаблонизатором можно закэшировать содержимое шаблона и при последующих его загрузках отдавать его напрямую из кэша. Примерно так:

class SomeTemplater
{
	protected $_templates = array();

	public function loadTemplate($path) {
		if (array_key_exists($path, $this->_templates)) {
			$code = $this->_templates[$path];
		}
		else {
			$code = file_exists($path)
			      ? file_get_contents($path)
			      : false;

			$this->_templates[$path] = $code;
		}

		return $code;
	}
}
Ответ написан
Комментировать
@egorinsk
Вы абсолютно правильно заметили. Не знаю, кто это придумал, но делать блоки на странице через подключение отдельных файлов абсолютно неэффективно с точки зрения производтельности и неуклюже с точки зрения архитектуры. Костыль, а не решение. Логично использовать для этого функции или статические методы классов (бонус: получаем автозагрузку и изоляцию локальных переменных). Пример шаблона:

class UserBlock {
public static function renderUserInfo($user) {
?>
… HTML код…
<?php
}
}

Пример использования:

<?php foreach ($users as $user): ?>
{div}<?php UserBlock::renderUserInfo($user); ?>{/div}
<?php endforeach ?>

Людям, которые скажут, что плохо использовать функции в шаблонах (почему, кстати?), предложите придумать более простое, изящное, быстрое, без использования громоздких бибилиотек и надежное решение, а потом убедитесь, что у них ничего не вышло.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы