PHP templating с str_replace?

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

$str_template = "<html><head><title>{the_title}</title><body>{the_content}</body></html>"

а в следующем коде просто str_replace, чтобы вставить данные в мою переменную шаблона, например

str_replace( $str_template, '{the_title}', $some_runtime_generated_title );
str_replace( $str_template, '{the_content}', $some_runtime_generated_content );

то наконец

echo $str_template; 

Будет ли, надеюсь, сделать процесс передачи переменной в несколько быстрее? Я знаю, что это может быть странный вопрос, но кто-нибудь пробовал это?

Ответ 1

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

Вы спрашиваете, будет ли это "сделать процесс передачи переменной в целом немного быстрее". Быстрее чем? Вы сталкиваетесь с проблемами производительности с тем, что вы делаете прямо сейчас?

Ответ 2

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

Вы также можете использовать массивы с str_replace и, таким образом, сделать еще много замен с помощью одного вызова функции, такого как

str_replace(array('{the_title}', '{the_content}'), array($title, $content), $str_template);

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

Ответ 3

Это хорошая идея использовать механизм шаблонов.

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

вы можете использовать html файлы, содержащие php-теги для вывода (например, <?=$var?>) и только петли. включите их через "include" в ваш php-код. это намного быстрее.

взгляните на smarty. это мой любимый механизм шаблонов для php. У smarty есть много хороших функций, таких как кеширование и расширение с помощью плагинов.

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

Ответ 4

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

$tokens = preg_split('/(\{[^\}]+\})/', $string, -1, PREG_SPLIT_DELIM_CAPTURE);

Теперь вы можете повторять токены и проверять, является ли это переменным или обычным текстом:

foreach ($tokens as $token) {
    if ($token[0] === '{' && $token[strlen($token)-1] === '}') {
        // token is a variable
    } else {
        // token is plain text
    }
}

Преимущество этого подхода заключается в том, что переменные не заменяются в тексте, который уже был заменен. Итак:

$foo = '{bar}';
$bar = 'bar';
$template = 'Lorem {foo} {bar} sit amet …';

Здесь текст будет заменен на Lorem bar {bar} sit amet …, а не Lorem bar bar sit amet …, как это было бы с вашим кодом, когда {bar} заменяется после {foo}.

Ответ 5

Конечно, вам нужно иметь аргументы в правильном порядке. str_replace()

Также может быть хорошей идеей разместить шаблоны в собственном файле, а не хранить их в строке. Затем просто прочитайте их через file_get_contents() или аналогичный.

Ответ 6

Если вы выполняете только расширение переменной, вы можете сделать:

$str_template = "<html><head><title>$the_title</title><body>$the_content</body></html>";

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

Конечно, есть и другие преимущества для этих систем, такие как более безопасный доступ к переменным, возможно, легче обрабатывать дизайнеры (или генерировать с помощью инструментов), ограничение логики в слое представления... Что является общей критикой из тяжелых систем шаблонов, таких как Smarty, с такой логикой, что вы можете почти написать с ней еще одну систему шаблонов!; -)

Некоторые системы шаблонов, такие как Savant, занимают среднюю дорогу.: -)

Ответ 7

Вы просто не можете сделать шаблон таким образом.
Шаблон реальной жизни потребует не только простых переменных для заполнения, но также нескольких структур управления или, по крайней мере, некоторых блоков для управления определенными областями страницы (например, для создания циклов).
Таким образом, вы не можете создать шаблон с помощью str_replace. Также потребуются некоторые регулярные выражения и сложный парсинг.

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

Ответ 8

в основном идея состоит в том, что один, но шаблон - это нечто большее, например, RainTPL - WYSIWYG, потому что он заменяет относительные пути в шаблоне с помощью путей сервера, таким образом вы создаете свой шаблон в локальном режиме, и это работает на сервере без необходимости изменения img/css.

Ответ 9

На самом деле ответ "Ваше здравое чувство" является правильным. Вы можете использовать PHP для использования текущего контекста и замены переменных. Вместо записи вывода вы можете сделать ob_start(), чтобы удерживать его в буфере и получать замененное содержимое. Легко и элегантно!