Я писал 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; }
Это эффективно отображает весь код, заменяя переменные на их правильный контент.
в моих шаблонах я использую буферизацию вывода для захвата включенного скрипта. включенный код запускается точно так же, как и любой другой включенный файл. псевдо: начальный буфер, включающий файл, буфер захвата, буфер стирания. вот краткий пример:
//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
будет иметь что-либо, выводимое включенным файлом после того, как он запустит любой код внутри. Это позволяет мне использовать циклы и вары, а также при обработке «представления».
Обратите внимание, что это используется на моем личном сайте, где я единственный, кто вносит изменения в файлы шаблонов. Я не разрешаю кому-либо редактировать файлы шаблонов, поскольку это было бы смехотворно глупо.