Прохождения анонимной функции и получение переменных из внешней области


Я делаю что-то очень странное. Я пытаюсь создать крошечный система для создания встроенных шаблонов в PHP, так что я могу выполнить рефакторинг путем создания нескольких шаблонов по оригинальному сценарию, и в конечном итоге перейти шаблоны для отдельных сценариев.

Вот глупо/базовая библиотека шаблонов, которая просто вызывает анонимную функцию, которая передается в после заголовка HTML вещи, а затем вызывает в футере:

<?php
// System for using simple, native php templates.

// TODO: Put this in a namespace to keep it clean and separate.

function display_page_inline($templates, $options, $data){
    $title = @$options['title'];
    echo "<html><head><title>".$title."</title></head>";

    if(is_array($templates)){
        foreach($templates as $template_function){
            $template_function($data);
        }
    } else{
        $template($data); // Call & display the template.
    }


    echo "<div>Footer</div>";
    echo "</html>";
}

?>

Вот где это будет странно. В Скрипты я создаю анонимные функции, сохраняются в переменные, а затем передает их в библиотеку шаблонов для вывода. Чтобы избежать того, чтобы вызвать элемент массива (и проверить, существует ли элемент каждый раз), я пытаюсь экспортировать массив переданный для получения стандартных переменных в шаблоне (например, $имя вместо $массив_данных['имя']). Есть ли способ абстрагироваться такое поведение в PHP?

<?php
require_once('core.php');


// Inclusion of the template library
require_once('../core/inline_templates.php');
// Initialization Logic
$title = 'Bob';

// Decide what will be able to be output and put it into an array to pass to the template
$template_output_variables = array('name'=>'no name');


// The page gets displayed at the bottom.

// =================== Templates ========================================
// Todo: Potentially namespace the stuff here.
// Define the anonymous template function here, has html and such in native php here.
$contact_us = function ($template_output_variables=null){
    extract($template_output_variables); // Pull the variables.
    // Leave php in the template function.
    ?>
    <body>
    Hello World Body Text, Hello <?php h($name);?>.
    </body>

    <?php
}; // End of template function declaration.


$killer_section = function ($data=null){
    extract($data); // Pull the variables.
    ?>
    Breaking news, There is a killer among us.

    <?php
}; // End of killer section anon. function.



// Display the page.

// call & display the template via delayed execution, display it within a pre-set head and footer.
display_page_inline($templates=array($contact_us, $killer_section), $options=array('title'=>$title), $template_output_variables);



?>

Это очень странно, я знаю, но я пытаюсь делать новый подход к рефакторингу, так и воспользоваться новой для PHP 5.3 функции, а делать это. Цель состоит в том, чтобы иметь встроенные шаблоны, которые я могу поставить в любом скрипте, как я хочу, и двигаться куда захочу позже, или объединить шаблоны и т. д.



1492
3
задан 7 сентября 2011 в 10:09 Источник Поделиться
Комментарии
1 ответ

Нечто подобное хотел сделать вам большую часть пути там:

<?php
function h($val) {
echo $val;
}

function template_function($template_body) {
return function(array $template_output_variables = null) use ($template_body) {
if ($template_output_variables !== null) {
extract($template_output_variables);
}
$contents = eval('?>'.$template_body.'<?php');
echo $contents;
};
}

$contact_us = template_function('
<body>
Hello World Body Text, Hello <?php h($name);?>.
</body>'
);

$contact_us(array('name' => 'Johnny Boy'));

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

Самый простой способ, чтобы очистить его, ИМО, можно было бы покончить с разрешительными сырые PHP в шаблонах. Я довольно неравнодушен к веточке, вы сможете найти вдохновение там.

2
ответ дан 19 марта 2012 в 09:03 Источник Поделиться