所以我们都知道你应该总是,不仅在PHP中,单独的代码来自content / design / html。 (我今天在这里见过相反的人)
我的意思是,你不想在更大的项目中使用其中一个,是吗?
<?php
echo '<div id="blah"><b>'
. $username . '</b>'
. $stuff . '<more HTML mixed with PHP...>';
?>
但是:将代码与内容分开的好方法是什么?
我一直在使用一个简单的模板系统来替换模板中的通配符。
e.g:
<div id="blah"><b>%USERNAME%</b>%STUFF% <...>
(位于单个文件中)
稍后您可以调用类似于GetTemplate( 'myTemplate', array ( 'USERNAME' => 'Stranger' ) );
最后,问题:
答案 0 :(得分:3)
你应该意识到PHP本身就是一种模板语言。您的
<div id="blah"><b>%USERNAME%</b>%STUFF% <...>
与
不同<div id="blah"><b><?php echo $USERNAME; ?></b><?php echo $STUFF; ?> <...>
只是非常表面。被授予,PHP的NOTICEs和WARNINGs是非常愚蠢的而不是异常(Python的一点是PHP),而你的自定义实现可能更容易让你e。 G。扔掉而不是产生致命的错误(噢,Smarty的乐趣)如果把逻辑放到某个地方的模板中,结果证明是两个邪恶(循环)中较小的一个。如果模板提到一个未定义的变量(PHP会发出NOTICE)等,你可能想抛出。
答案 1 :(得分:2)
我不是粉丝额外的模板语言(取代通配符)而是我喜欢保持我的模板纯PHP,所以我对你所做的事情的转变将是:
<div id="blah"><b><?php echo $username ?></b><?php echo $stuff ?><...>
echo GetTemplate( 'myTemplate.php', array ( 'username' => 'Stranger', 'stuff' => 'Stuff' ) );
function GetTemplate($templatePath, array $vars = array())
{
extract($vars);
ob_start();
include($templatePath);
return ob_get_clean();
}
我将它与辅助函数/ object-&gt;方法结合起来,例如:
<?php echo link_to($name, $url); ?>
function link_to($name, $url, array $attributes = array())
{
$attributes['href'] = urlencode($url);
foreach($attributes as $attrib => $value)
{
$attributes[$attrib] = $attrib."=\"$value\"";
}
return sprintf('<a %s>%s</a>', implode(" ",$attributes), $name);
}
我通常将这些帮助器应用于常用的标签/结构,以及具有类似content_tag($tag, $content, $attributes);
的通用html标签,这有助于避免随机标签的大量属性的php回声。我显然不会将它用于每个html标签,我只使用它来获得比大量回声更好的可读性。
就模板引擎来说,我真的没有看到好处,因为php是模板语言。至于非程序员/编码员,他们必须精简循环和变量的语法,我怎么也看不到如何将它改为通配符或者smarty的{}语法添加任何东西。
答案 2 :(得分:2)
有一个名为Smarty的可靠的PHP模板引擎。它不是大型框架的一部分,对我来说这是一个巨大的优势。 Smarty支持缓存,并且由于它是模板文件的“编译”,因此与传统的查找/替换模板相比具有其他性能提升。
答案 3 :(得分:0)
像phpBB这样的大项目使用模板工作。它稍微复杂一点,因为它们也允许(for)列表,包括其他模板和其他高级功能。你肯定想要分开代码和内容。
作为奖励,这允许非程序员制作你的HTML。
答案 4 :(得分:0)
使用PHP作为模板语言的Zend Framework的方法(它不会增加额外的解析开销)似乎是一个很好的应用程序
我真正喜欢的另一种方式是limonade framework使用的方法,它使用ob_start()并包含实际处理模板