2010-01-31 84 views
1

因此,我们都知道您不仅应该在PHP中将content/design/html代码分开。 (我已经看到人们说今天在这里相反)PHP内容分离

我的意思是,你不希望这些在更大的项目之一,你呢?

<?php 

echo '<div id="blah"><b>' 
    . $username . '</b>' 
    . $stuff . '<more HTML mixed with PHP...>'; 

?> 

但是:什么是将内容与代码分开的好方法?

我一直在使用一个简单的模板系统来取代模板中的通配符。

如:

<div id="blah"><b>%USERNAME%</b>%STUFF% <...> 

(位于单个文件)

以后你可以叫类似的功能,GetTemplate('myTemplate', array ('USERNAME' => 'Stranger'));

最后,问题:

  • 这是一个好方法吗? f分离代码和内容?
  • 如何在不使用框架的情况下做到这一点?
  • 有没有更好的方法?
+1

我不明白你给的第二个例子比第一个更好。问题不在于标记中有代码,而是具有业务逻辑。只是像你在第一个例子中那样评估变量的值本身并不是问题。 – 2010-01-31 20:34:07

+0

“说相反的人”可能暗示我的这个答案:http://stackoverflow.com/questions/2172538/php-a-personal-framework/2172555#2172555。我不明白我在那里所说的可以被解释为暗示代码不应该与设计分开。 – 2010-01-31 20:42:57

回答

2

我不是球迷OV额外的模板语言(即替代通配符),而不是我喜欢让我的模板纯PHP所以我对你做了什么vertion是:

<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(); 
} 

我ALOS与辅助功能/对象 - >方法结合这个问题,以及例如:

<?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); 
} 

我一般适用喜欢这些助手常用标签/结构以及有一个通用的html标签,看起来像content_tag($tag, $content, $attributes);这可以帮助我避免一个PHP回声吨属性为随机标签。我明显不使用它为每个html标签,我只用于那些比一吨回声更好的可读性。

至于模板引擎去我真的不看到好处,因为PHP是模板语言。就非程序员/编码人员而言,他们必须依赖循环和变量的语法,所以我没有看到如何将其更改为通配符或smarty的语法添加任何内容。

+0

您的系统似乎已经遗忘了'htmlspecialchars',使其容易受到XSS攻击。 – bobince 2010-01-31 21:12:23

+0

eh jsut一个例子thers很多事情在那里,需要检查和担保,但我没有通过所有的演示。此外,在这一点上,获得模板的变量可以被认为是可信的,因为它们已经被清理(在进入数据库之前或者在从请求中解析数据之前)。 – prodigitalson 2010-01-31 21:15:12

+0

我喜欢这个想法,但我需要在循环中添加内容。这会不会像这样使用它,因为我正在做多个包含相同的行。 – 2016-11-21 12:44:23

0

大项目,如phpBB使用模板。它稍微复杂一些,因为它们还允许列表(包括其他模板和其他高级功能)。你一定想分开代码和内容。

作为奖励,它允许非程序员制作你的html。

0

它使用PHP作为模板语言(不添加额外的解析开销)Zend框架的做法似乎是一个好apporach

另一种方式我真正喜欢的是它使用ob_start由limonade framework使用的方法()和包括实际处理模板

3

你应该认识到,PHP本身是一个模板语言。您

<div id="blah"><b>%USERNAME%</b>%STUFF% <...> 

不同于

<div id="blah"><b><?php echo $USERNAME; ?></b><?php echo $STUFF; ?> <...> 
只有

非常肤浅。当然,PHP对于它的NOTICE和WARNING而不是例外(Python已经超过了PHP的一点)是非常愚蠢的,而且你的自定义实现可能更容易让你e。 G。而不是产生一个致命的错误(哦,Smarty的欢乐),如果把逻辑放到某个模板的某个地方,结果会变成两个恶魔(循环)中较小的一个。如果模板提到一个未定义的变量(PHP会发出通知)等,您可能想要抛出等。

2

PHP有一个经过验证的模板引擎,名为Smarty。它不是一个庞大框架的一部分,这对我来说是一个巨大的优势。由于Smarty对模板文件的“编译”,Smarty支持缓存,并且在传统的查找/替换模板方面具有其他性能提升。