11

这两个版本之间有速度差异吗?

<?php echo $var; ?>

<?=$var?>

你推荐哪个,为什么?

4

10 回答 10

15

性能差异是微不足道的。此外,使用 APC,性能差异为零,零,无。

短标签在 XML 中是有问题的,因为<?它也是 XML 处理标签的标记。因此,如果您正在编写应该可移植的代码,请使用长格式。

请参阅http://www.php.net/manual/en/ini.core.phpshort_open_tag中的描述

于 2009-03-19T16:27:44.743 回答
7

从技术上讲,解析器必须解析较长版本的每个字符,并且每次传输都有更多字符。

如果您的网络服务器没有“预编译”(即:缓存标记化的 PHP 页面),那么性能会略有不同。除非您开始谈论数十亿次运行,否则这应该是微不足道的。

于 2009-03-19T16:22:48.220 回答
6

性能方面,它是微不足道的。

正确使用说使用更长的,因为它更便携。亲自?我做较短的。

于 2009-03-19T16:23:34.177 回答
5

不,它们是相同的。如果你喜欢打字很多使用<?php echo $var; ?>,否则只是节省时间<?=$var?>

于 2009-03-19T16:20:38.957 回答
4

在 php 5.3 短标签 ASP 样式的 <% %> 支持将被弃用,尽量避免这种情况并将代码重写为'<?php echo' format,因为你不能使用<?xml ?>例如内联。

于 2009-03-19T16:26:17.133 回答
4

你推荐哪个

都不是,除非你真的想允许 HTML 注入。(99% 的情况下,你不会。)

<?php echo htmlspecialchars($var); ?>

或者定义一个使用较短名称执行 echo(htmlspecialchars($arg)) 的函数,以避免所有输入。

于 2009-03-19T17:24:28.617 回答
3

这两行代码是相同的。

我添加了一个较晚的答案,因为还没有人证明这一点,但答案是明确的,没有性能差异,特别是因为PHP 执行这两行代码的方式完全没有区别。

解释器在这两种情况下看到相同的代码。解析器产生完全相同的AST,因为<?=它与<?php echo. <?=编写vs时解释器运行的指令没有区别<?php echo

通过安装php-ast,您可以检查两行代码生成的 AST。

鉴于这两种情况...

# CASE 1
<?php echo $i %>

# CASE 2
<?= $i ?>

两者的抽象语法树是相同的:

case 1
AST_STMT_LIST
    0: AST_ECHO
        expr: AST_VAR
            name: "i"
case 2
AST_STMT_LIST
    0: AST_ECHO
        expr: AST_VAR
            name: "i"

这意味着 PHP在运行时无法分辨它们之间的区别,更不用说体验某种性能差异了。

产生此输出的代码如下,并使用util.php

<?php
require('util.php');

echo "case 1\n";
echo ast_dump(ast\parse_code('<?php echo $i ?>', $version=50));

echo "\n";

echo "case 2\n";
echo ast_dump(ast\parse_code('<?= $i ?>', $version=50));

echo "\n";

优化在这里无关紧要。选择取决于个人喜好,特别是因为<?=始终可用,与短标签无关,从未被弃用,也不会从语言中删除。

于 2019-11-11T23:31:27.190 回答
2

我认为第二个需要将 short_open_tag(在 PHP.ini 中)设置为 true。

这意味着它有可能在某些网络服务器上被关闭。

于 2009-03-19T16:27:30.830 回答
2

速度差异取决于您输入这 9 个额外字符的速度。
它还可以提高代码的可读性,但这值得商榷。

如果您谈论执行速度,则没有明显差异。

于 2009-03-19T18:04:07.867 回答
0

不要试图用这些来优化,没用的。相反,停用 allow_short_tags(因为加载 XML 文件时出现问题)并编写干净、可读和可理解的代码。

即使可能有细微的差别(肯定低于 10%),用它来优化也没有用。如果您的脚本很慢,请先查看您的循环。大多数情况下,通过优化程序流程比使用奇怪的语法可以获得更多的性能。

于 2009-08-12T08:56:47.473 回答