PHP-шаблон с заменой str?


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

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

Author: bpeterson76, 2009-01-25

9 answers

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

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

 4
Author: Greg Hewgill, 2009-01-25 09:00:54

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

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

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

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

 6
Author: Javache, 2013-04-05 09:17:43

Я бы построил синтаксический анализатор, который разбивает код на его токены (переменные и обычный текст). В качестве простого подхода вы можете использовать функцию 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
Author: Gumbo, 2009-01-25 10:13:46

Рекомендуется использовать механизм шаблонов.

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

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

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

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

 2
Author: Bernd Ott, 2013-09-06 20:06:46

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

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

 1
Author: matpie, 2009-01-25 09:01:54

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

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

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

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

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

 1
Author: PhiLho, 2009-01-25 14:23:07

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

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

 1
Author: Your Common Sense, 2011-02-25 09:27:26

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

 0
Author: Rajkumar Madhuram, 2012-09-13 00:37:36

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

 0
Author: RainElemental, 2014-12-21 10:19:29