Как я могу вывести эти динамические данные без Eval? - PullRequest
1 голос
/ 13 августа 2010

Я писал CMS в стиле MVC и использовал класс Template для извлечения различных файлов, необходимых через file_get_contents

В конце я делаю

eval('?>'.($template).'<?');

Зная, чтоeval - это зло, как я могу альтернативно очистить эти данные, чтобы PHP фактически отображал код?

В данный момент класс Template делает это, когда все загружено.Возможно ли, чтобы класс Template возвратил этот код в мой index.php как переменную, а затем запустил что-то для его выполнения?

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

Еще один связанный с этим вопрос - я понимаю, что eval может использоваться для запуска вредоносного кода, введенного пользователем, но разве какая-то другая функция не постигла бы та же участь?Если я превращу какой-либо пользовательский контент в html-сущности, разве это не поможет?


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

Я сделалпросто найдите этот фрагмент, который выполняет то же самое:

function interpolate( $string ){
        foreach ($GLOBALS as $name => $value){

            $string = str_replace( '$'.$name, $value, $string );
        }

        $string = preg_replace( '/[$]\\w+/', '', $string );
        return $string;

    }

Это эффективно отображает весь код, заменяя переменные с их правильным содержанием.

1 Ответ

0 голосов
/ 13 августа 2010

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

//just the name of a template file to include.
$template = "someFile.tpl";
//start output buffering
ob_start();
//include the file. It has full access to all vars and runs
//code just like any other included script.
include($template);
//get anything output by the buffer during the include
$template_output = ob_get_contents();
//clean out the buffer because we already got the contents.
ob_end_clean();

После этого $template_output будет выводить что-либо из включенного файла после запуска кода внутри. Это позволяет мне использовать циклы и переменные и тому подобное при обработке «представления».

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

...