我已经使用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足迹是一个很大的好处。
感谢您的考虑。
答案 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
下进行。