PHP шаблонизируется с помощью str_replace? - PullRequest
11 голосов
/ 25 января 2009

Я думаю, что основным принципом системы шаблонов 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; 

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

Ответы [ 9 ]

6 голосов
/ 25 января 2009

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

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

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

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

4 голосов
/ 25 января 2009

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

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

2 голосов
/ 25 января 2009

Я бы собрал парсер, который разбивает код на его токены (переменные и простой текст). Для простоты вы можете использовать функцию 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}.

2 голосов
/ 25 января 2009

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

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

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

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

если вы понимаете по-немецки, посмотрите здесь . есть небольшое введение в smarty.

1 голос
/ 23 февраля 2011

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

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

1 голос
/ 25 января 2009

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

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

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

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

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

1 голос
/ 25 января 2009

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

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

0 голосов
/ 13 сентября 2012

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

0 голосов
/ 23 февраля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...