php
标签呢?显然,在大片的HTML代码中打开和关闭
php
标签是明智的。那么在处理生成XML等内容时呢?你应该为每个数据片段打开和关闭php
标签,或者在单个echo中使用包含在引号中的XML标记的单个echo呢?php
标签呢?php
标签是明智的。那么在处理生成XML等内容时呢?你应该为每个数据片段打开和关闭php
标签,或者在单个echo中使用包含在引号中的XML标记的单个echo呢?就维护的角度来看,我个人认为应该尽可能将HTML/XML与代码分离,这样即使由非技术人员进行轻微更改也可以很容易地完成。
标记越均匀,工作越清晰。
实现此目的的一种方法是尽可能使用变量并使用heredoc语法:
// Preparation
$var1 = get_value("yxyz");
$var2 = get_url ("abc");
$var3 = ($count = 0 ? "Count is zero" : "Count is not zero");
$var4 = htmlentities(get_value("def"));
// Output
echo <<<EOT
<fieldset title="$var4">
<ul class="$var1">
<li>
$var2
</li>
</ul>
</fieldset>
EOT;
当然,您将希望使用更明智的变量名称。
编辑:评论中@stesch指出的链接提供了一些很好的理由,支持在生成XML时使用序列化器,并且通过扩展甚至可以用于HTML,而不是像上面那样直接打印。我认为并不是在每种情况下都需要使用序列化器,特别是从维护的角度来看,模板更容易编辑,但这个链接确实值得一读。如何避免在生成XML时被称为Bozo
逻辑与内容之间的分离还有一个巨大的优势,即如果将来需要转换为模板引擎或者引入缓存,它几乎是无痛实现的,因为逻辑和代码已经分开了。
PHP通过所谓的“heredocs”解决了这个问题。请查看。
示例:
echo <<<EOD
<td class="itemname">{$k}s</td>
<td class="price">{$v}/kg</td>
EOD;
注意:这个示例中的heredoc标识符(EOD)不能有任何空格或缩进。
无论哪种方式对您来说都是合理的。即使大回声更快,性能差异也很小。
但是,一个大字符串的回声很难阅读,并且更多地 <?php echo $this->that; ?>
可以讲述一个故事 :)
echo
会将其参数发送到请求处理链的下一级,最终通过网络套接字将此字符串发送到客户端。根据echo
与底层软件层(例如Web服务器)的配合方式,有时您的脚本可能比向客户端推送数据更快。但是,如果没有输出缓冲,则不行。使用输出缓冲区,您可以通过交换内存来获得速度 - 由于它们积累在内存缓冲区中,因此您的echo
速度更快。但是仅当没有隐式缓冲时才是如此。必须检查Apache源代码以查看其如何处理PHP的stdout
数据。echo
连接输出更有效率。同样的逻辑,进入PHP代码块(SGML / XML标记中的PHP处理指令)一次比多次进入和退出要更有效率。echo
来组装我的标记,而是使用XML DOM API。这也符合上面链接的文章。 (我转载链接:http://hsivonen.iki.fi/producing-xml/)这也回答了是否使用一个还是多个PHP标记的问题。使用一个标记作为整个脚本,让它组装生成的标记并将其发送到客户端。我很久以前也问过自己同样的问题,并得出了相同的答案,没有太大的区别。我用这个测试推断出这个答案:
<?
header('content-type:text/plain');
for ($i=0; $i<10; $i++) {
$r = benchmark_functions(
array('output_embeed','output_single_quote','output_double_quote'),
10000);
var_dump($r);
}
function output_embeed($i) {
?>test <?php echo $i; ?> :)<?
}
function output_single_quote($i) {
echo 'test '.$i.' :)';
}
function output_double_quote($i) {
echo "test $i :)";
}
function benchmark_functions($functions, $amount=1000) {
if (!is_array($functions)||!$functions)
return(false);
$result = array();
foreach ($functions as $function)
if (!function_exists($function))
return(false);
ob_start();
foreach ($functions as $idx=>$function) {
$start = microtime(true);
for ($i=0;$i<$amount;$i++) {
$function($idx);
}
$time = microtime(true) - $start;
$result[$idx.'_'.$function] = $time;
}
ob_end_clean();
return($result);
}
?>
个人而言,我倾向于选择看起来最好的代码,因为代码可读性非常重要,特别是在团队环境中。至于最佳实践,我不确定,但通常最佳实践是最后进行优化,这意味着您应该首先为可读性编写代码,然后如果遇到速度问题,请进行一些重构。
除非您正在执行数百万次 echo,否则您对效率的任何问题都可能出现在代码的其他位置。
另一个需要考虑的事情是使用 MVC 来将“视图”与所有业务逻辑分离,这是一种非常干净的编码方式。使用像 smarty 这样的模板框架可以进一步提高效率。
无论做什么,都不要打印 XML!