PHP - 输出还是不输出?

16
什么更有效率和/或更好的做法,是在HTML中使用echo还是有许多打开和关闭php标签呢?
显然,在大片的HTML代码中打开和关闭php标签是明智的。那么在处理生成XML等内容时呢?你应该为每个数据片段打开和关闭php标签,或者在单个echo中使用包含在引号中的XML标记的单个echo呢?
7个回答

21

就维护的角度来看,我个人认为应该尽可能将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

逻辑与内容之间的分离还有一个巨大的优势,即如果将来需要转换为模板引擎或者引入缓存,它几乎是无痛实现的,因为逻辑和代码已经分开了。


4
我甚至不知道heredoc存在的意义 - 这就是我喜欢stackoverflow的原因...有这么多知识在分享。谢谢 - Mark
@stesch: 真的,一个HTML示例可能更合适。另一方面,我用这种方式生成小的XML片段没有任何问题。为什么我不能呢? - Pekka
@stesch,所有的观点都很好,特别是关于漂亮打印的观点。我仍然认为在许多情况下,这种生成XML的方式是可以接受的,而序列化程序通常会过度。不过,我会添加一个HTML示例,并在XML示例中添加一个注释,包括您的链接。 - Pekka
哇,这是真正的厉害东西! - Shrayas
太棒了,非常感谢Pekka!! - Tom Granot

4

PHP通过所谓的“heredocs”解决了这个问题。请查看

示例:

  echo <<<EOD
  <td class="itemname">{$k}s</td>
  <td class="price">{$v}/kg</td>
EOD;

注意:这个示例中的heredoc标识符(EOD)不能有任何空格或缩进。


3

无论哪种方式对您来说都是合理的。即使大回声更快,性能差异也很小。

但是,一个大字符串的回声很难阅读,并且更多地 <?php echo $this->that; ?>可以讲述一个故事 :)


此外,如果您遇到性能问题,您可能会使用某种缓存,这应该消除对这种区分的需求。另外+1。 - Itay Moav -Malimovka

2
echo会将其参数发送到请求处理链的下一级,最终通过网络套接字将此字符串发送到客户端。根据echo与底层软件层(例如Web服务器)的配合方式,有时您的脚本可能比向客户端推送数据更快。但是,如果没有输出缓冲,则不行。使用输出缓冲区,您可以通过交换内存来获得速度 - 由于它们积累在内存缓冲区中,因此您的echo速度更快。但是仅当没有隐式缓冲时才是如此。必须检查Apache源代码以查看其如何处理PHP的stdout数据。
话虽如此,以下所有内容仅适用于启用输出缓冲的脚本,因为如果没有输出缓冲,则尝试一次性推送更多数据需要等待更长时间(客户端必须通过TCP接收和确认它!)。
一次发送大字符串比进行Necho连接输出更有效率。同样的逻辑,进入PHP代码块(SGML / XML标记中的PHP处理指令)一次比多次进入和退出要更有效率。
至于我,我不使用echo来组装我的标记,而是使用XML DOM API。这也符合上面链接的文章。 (我转载链接:http://hsivonen.iki.fi/producing-xml/)这也回答了是否使用一个还是多个PHP标记的问题。使用一个标记作为整个脚本,让它组装生成的标记并将其发送到客户端。

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

1

个人而言,我倾向于选择看起来最好的代码,因为代码可读性非常重要,特别是在团队环境中。至于最佳实践,我不确定,但通常最佳实践是最后进行优化,这意味着您应该首先为可读性编写代码,然后如果遇到速度问题,请进行一些重构。

除非您正在执行数百万次 echo,否则您对效率的任何问题都可能出现在代码的其他位置。

另一个需要考虑的事情是使用 MVC 来将“视图”与所有业务逻辑分离,这是一种非常干净的编码方式。使用像 smarty 这样的模板框架可以进一步提高效率。


1

3
有趣的是看到两个傻瓜已经被标题吸引了。 ;) (注:原文中的“bozos”是一种比较口语化的贬义词,意指蠢人或笨蛋。为了让译文更容易理解,我将其翻译成了“傻瓜”。) - just somebody

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接