Хорошо, сначала позвольте мне объяснить, что-то сказать вам, что PHP - ШАБЛОН ПАРСЕР .
Делать то, что вы делаете, это все равно, что создавать анализатор шаблонов из анализатора шаблонов, бессмысленно и довольнооткровенно говоря, это повторяет меня, что синтаксический анализатор шаблонов, такой как smarty, стал настолько хорошо справляться с бессмысленной задачей.
То, что вы должны сделать, это создать вспомогательный шаблон, а не синтаксический анализатор, поскольку он является избыточным, в терминах программирования файл шаблонаупоминается как представление , и одна из причин, по которой им было дано конкретное имя, заключается в том, что люди будут знать его отдельно от моделей, логики домена и т. д.
Что вам следует сделать, так это найти способчтобы инкапсулировать все данные вашего представления в самих ваших представлениях.
Примером этого является использование 2 классов
Функциональность класса шаблона заключается в том, что логика домена устанавливает данные для представления и обрабатывает их.
Вот краткий пример:
class Template
{
private $_tpl_data = array();
public function __set($key,$data)
{
$this->_tpl_data[$key] = $data;
}
public function display($template,$display = true)
{
$Scope = new TemplateScope($template,$this->_tpl_data); //Inject into the view
if($display === true)
{
$Scope->Display();
exit;
}
return $Scope;
}
}
Это очень простой материал, который вы могли бы расширить, ну и что касается Scope, это в основном класс, где ваши представления компилируются в интерпретаторе, это позволит вам иметь доступ к методам в классе TemplateScope, ноне вне класса области видимости, то есть имени.
class TemplateScope
{
private $__data = array();
private $compiled;
public function __construct($template,$data)
{
$this->__data = $data;
if(file_exists($template))
{
ob_start();
require_once $template;
$this->compiled = ob_get_contents();
ob_end_clean();
}
}
public function __get($key)
{
return isset($this->__data[$key]) ? $this->__data[$key] : null;
}
public function _Display()
{
if($this->compiled !== null)
{
return $this->compiled;
}
}
public function bold($string)
{
return sprintf("<strong>%s</strong>",$string);
}
public function _include($file)
{
require_once $file; // :)
}
}
Это только базовая и не работает, но концепция есть, Вот пример использования:
$Template = new Template();
$Template->number = 1;
$Template->strings = "Hello World";
$Template->arrays = array(1,2,3,4)
$Template->resource = mysql_query("SELECT 1");
$Template->objects = new stdClass();
$Template->objects->depth - new stdClass();
$Template->display("index.php");
и внутри шаблона выбудет использовать традиционный php следующим образом:
<?php $this->_include("header.php") ?>
<ul>
<?php foreach($this->arrays as $a): ?>
<li><?php echo $this->bold($a) ?></li>
<?php endforeach; ?>
</ul>
Это также позволяет вам включать в шаблоны, которые все еще имеют доступ к ключевому слову $this
, чтобы потом включать себя, что-то вроде рекурсии (но это не так).
Тогда, не создавайте программно кеш программно, так как кешировать нечего, вы должны использовать memcached
, который хранит предварительно скомпилированный исходный код в памяти, пропуская большую часть компиляции/ интерпретировать время