2013-05-14 8 views
5

В настоящее время я делаю это так:Ленивые переменные нагрузки в шаблонах

function load_template($script, $args){ 
    extract($args); 
    require __DIR__ . '/templates/' . $script; 
} 

В моем коде контроллера:

// if home page was requested 
load_template('home.php', array(
    'title' => get_title(), 
    'content' => get_content(), 
    ... 
)); 

Шаблон просто PHP скрипт как

<!DOCTYPE html> 
<html> 
<head> 
    <title> <?php echo $title; ?> </titlee> 
... 

Мне было интересно, можно ли как-то лениво загрузить эти переменные, поэтому я фактически не запускаю get_title() или get_content(), пока шаблон не запросит переменную.

Возможно ли это, без создания парсера шаблона? Я бы очень хотел придерживаться простых скриптов .php и html в качестве шаблонов.


Короче, что я прошу, если это возможно, чтобы автоматически присвоить значение переменной только тогда, когда он первый запрошенной.

$var = func(); // this should not run 

if($var){  // now the code above should run:) 
    echo $var; // <- the value that was just assigned (don't run func() again) 
} 

ответ

1

На мой взгляд, если вы не хотите, чтобы изменить шаблон для извлечения переменных, вы можете создать, например, массив, знать бы какие переменные каждый нуждается в шаблон.

Вы можете рассмотреть функцию (назовем ее caller), в которую вы передадите все параметры и имя шаблона. caller может выбирать переменные. Эта идея похожа на заводский класс в oop.

Я думаю, что нет никакого другого пути, но ...

При вставке шаблона и использовать unexistent переменного, предупреждение будет показано. Вы можете заставить PHP генерировать исключения в предупреждениях, а затем в блоке try ... catch разобрать его. Я считаю, что это слишком сложно и не стоит усилий.

EDIT

Третья идея заключается в том, чтобы создавать объекты вместо массивов. Объект сохранит всю вашу переменную $args. В вашем шаблоне просто измените <?php echo $title; ?> на <?php echo $argument_object->getTitle(); ?> и введите код getTitle(). getTitle(), как метод, а не функция, будет запускаться только по запросу.

Смежные вопросы