回显HTML或有多个打开和关闭的php
标记,效率更高和/或什么是更好的做法?
显然,对于大范围的HTML,打开和关闭php
标签是明智的。在处理生成XML这样的事情时呢?您是应该为每个数据打开和关闭带有单个回显的php
标记,还是使用带引号中包含的XML标记的单个回显?
答案 0 :(得分:20)
从维护的角度来看,应该尽可能将HTML / XML与代码分开,以便即使是非技术人员也可以轻松地进行微小的更改。
标记的同质块越多,工作就越清晰。
实现这一目标的一种方法是尽可能多地准备变量,并使用heredoc syntax:
// 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,而不是如上所示将其打印出来。我不认为在每个情况下都需要一个序列化程序,特别是从维护的角度来看,模板所以更容易编辑,但链接非常值得阅读。 HOWTO Avoid Being Called a Bozo When Producing XML
逻辑和内容分离的另一个重要优势是,如果转换到模板引擎,或者有一天需要引入缓存,那么实现它几乎是无痛的,因为逻辑和代码已经分离了。
答案 1 :(得分:4)
PHP通过所谓的heredocs
解决了这个问题。 Check it out please.
示例:
echo <<<EOD
<td class="itemname">{$k}s</td>
<td class="price">{$v}/kg</td>
EOD;
注意: heredoc标识符(本例中为EOD)不得有任何空格或缩进。
答案 2 :(得分:3)
无论哪个对你有意义。即使大回声更快,性能差异也是微不足道的。
但是大字符串的回声很难读,更多<?php echo $this->that; ?>
讲故事:)
答案 3 :(得分:2)
echo
在请求处理链中进一步发送其参数,并最终通过说网络套接字将该字符串发送到客户端。根据{{1}}与底层软件层(例如网络服务器)一起工作的方式,有时您的脚本可能能够比将数据推送到客户端更快地执行。没有输出缓冲,就是这样。使用输出缓冲,您可以交换内存以获得速度 - 您echo
更快,因为它们会累积在内存缓冲区中。但前提是没有隐式缓冲。我们必须检查Apache源代码,看看它如何处理PHP echo
数据。
也就是说,以下任何内容都适用于仅支持输出缓冲的脚本,因为如果没有它,您尝试推送的数据越多,您必须等待的时间越长(客户端必须通过TCP方式接收和确认它! )。
一次发送大字符串比 N stdout
连接输出更有效。通过类似的逻辑,解释器进入PHP代码块(SGML / XML标记中的PHP处理指令)一次比进入和退出多次更有效。
至于我,我使用的不是echo
,而是使用XML DOM API。这也与上面链接的文章一致。 (我重新打印链接:http://hsivonen.iki.fi/producing-xml/)这也回答了是否使用一个或多个PHP标签的问题。使用一个标签作为整个脚本,让它组装生成的标记并将其发送给客户端。
答案 4 :(得分:1)
就个人而言,我倾向于选择看起来最佳,因为代码可读性非常重要,特别是在团队环境中。在最佳实践方面,我担心我不确定通常最佳做法是优化最后的含义,你应该首先写它是为了可读性,然后如果你遇到速度问题做一些重构。
除非您正在进行数百万次回声,否则您在效率方面遇到的任何问题都可能出现在代码的其他地方。
要考虑的另一件事是使用MVC将您的“视图”与所有业务逻辑分开,这是一种非常干净的代码方式。使用像smarty这样的模板框架可以更进一步,从而获得史诗般的胜利。
答案 5 :(得分:1)
无论你做什么,都不要打印XML!
答案 6 :(得分:1)
我很久以前就提出了同样的问题并提出了相同的答案,这并没有太大的区别。我用这个测试来推断这个答案:
<?
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);
}
?>