PHP保持HTML清洁

时间:2010-01-26 00:28:55

标签: php html

我已经使用php工作了大约一年了,我终于开始在理解OOP方面取得一些进展。所以,现在我正在编写类,我正在寻找最简洁的方法来将PHP应用到我的HTML中。我基本上编写了一些输出存储在我的数据库中的数据的类。

例如,我将实例化一个“user”类的实例,我为此编写了一个名为getUserNameByIndex($ index)的函数,该函数“回显”一个值,然后我可以在我喜欢的庄园中写入我的HTML :

<h1> The <?php $user->getUserNameByIndex($index) ?> is not online </h1>

那很好。什么让我失望的是,如果我有一个我需要返回的字符串数组,那么我需要在我的HTML中编写更多的PHP,使我的输出页面看起来更像是另一个PHP脚本。

例如:

<span> His likes are:<br> <?php foreach($user->likes as $like){ if($like != foo){echo $like . '<br>' }} ?>

它对我来说似乎并不干净,但如果我将输出写入类方法,我就会取消一些我的风格控制。我想知道这里是否有平衡我应该寻找。或者,如果有一种标准方法来处理您打算在HTML中显示的字符串数组。我希望这是有道理的,而不是一个愚蠢的问题。我很高兴再次编写看起来像HTML的HTML,无论如何最小化我的代码中的PHP足迹是一个很大的好处。

感谢您的考虑。

6 个答案:

答案 0 :(得分:3)

将代码与设计分开的一种好方法是Model-View-Controller MVC )设计模式。
具体来说,在您的情况下,您正在寻找模型(数据处理)和视图(显示)的分离。

在PHP中已经存在许多已经存在的含义。一些值得关注的是:

CodeIgniter
Kohona
Symfony
Zend

(并且,如果您不反对使用模板语言作为模板语言解析器,我建议您查看Tiny But Strong。)

答案 1 :(得分:0)

您始终可以使用更友好的HTML PHP语法:

<?php foreach($user->likes as $like) : 
    if($like != foo):
?>
    <?=$like?><br>

<?php 
    endif;
endforeach; ?>

答案 2 :(得分:0)

Jascha,我很想构建一个页面类,其中包含用于在php中编写所有内容的方法,这样你就可以编写mid-html:

/* at the top of the file somewhere... */
$page = new PageWriter();
....
<!-- in the html body -->
<p><?php $page->print_users_likes($user); ?></p>

当然,您可以将这些方法添加到现有类中,或者仅将它们用作include或require上的普通方法。

这样做的原因纯粹是装饰性的 - 这样你就可以在你的html页面中看到发生了什么,而不是一些for循环,算法等。

我建议在php中查看include和require函数 - 我使用它来删除某些特定于某个页面的php。

答案 3 :(得分:0)

您也可以使用output buffering。您可以将模板加载到类中并返回已编译的HTML代码。

答案 4 :(得分:0)

我强烈推荐PHP Smarty Templating Engine。它允许您将演示文稿(HTML)与逻辑分开。 (PHP)内置缓存等功能,它确实简化了混合PHP和HTML的过程。

在它的稳定版本中,(v2)它已经有点面向对象了。 (PHP4 +兼容)在当前的开发版本(v3 - 已经在Beta 7中)它更加面向对象(PHP5 +兼容)

答案 5 :(得分:0)

鉴于PHP的本质,我发现像Smarty这样的模板系统过度。当然,在PHP和HTML代码之间不断交换是混乱的,难以阅读。

一种解决方案是在字符串中插入变量:

$all_likes=implode('<br />',$user_likes);
print "<span> His likes are:<br /> $all_likes</span>";

但是,如果您考虑将多个替换处理成不同字符串的情况(例如,对于多语言网站),那么更好的解决方案可能是使用[s] printf:

$template="<span> %s likes these:<br />$s</span>";
...
printf($template, getUserNameByIndex($index), implode('<br />',$user_likes));

(顺便说一下:这些都与OO没有任何关系)

如果你想要一个处理格式化一组任意值的通用方法到这样的模板中,你可以做类似的事情:

print render("<span>$s likes %s</span>",array($username, $user_likes));

function render()
{
   $args=func_get_args();
   foreach ($args as $key=>$val) {
      if ($key && is_array($val)) {
         $args[$key]=flatten($val);
      }
   }
   return call_user_func_array('sprintf',$args);
}

function flatten($inp)
{
   // there's probably a smarter way of doing this with 
   // the array fns
   $out='';
   $join='';
   foreach ($inp as $val) {
      $out.=$join;
      if (is_array($val)) {
         $out.=flatten($val);
      } else {
         $out.=$val;
      }
      $join="<br />\n";
   }
   return $out;
}

HTH

下进行。