echo带括号和不带括号有什么区别,为什么两种方法都存在?

8

我认为我们大多数用 PHP 编程的人都学过 echo "string";。虽然这很常见,但我想知道为什么我们使用它与其他任何函数都不一样。

那么为什么我们要这样做:

echo "Some String";

而不是

echo("Some String");

两者都存在且行为不同,为什么会这样?有没有关于为什么做出这个选择的参考资料?

人们提到 php 文档指出 echo 是一种语言结构,因此使用方式不同。但在这种情况下,既然可以把它作为结构体也可以作为函数使用:哪种方法更好呢?为什么以两种方式实现,而它本应只是一种语言结构?

与上述内容基本相同的还包括 requirerequire_onceincludeinclude_once。我找不到任何解释 - 为什么这些结构也被实现成函数形式(而在 echo() 的情况下,是有缺陷的)。


4
因为echo是一种语言结构,而不是一个函数。 - billyonecan
我个人更喜欢括号版本。据我所知,不同的语法来自于echo不是一个真正的函数这一事实。 - Wottensprels
4
我正在点赞以抵消一些负面评价。我知道这是一个偏好问题,但了解不使用括号的原因有助于改进自己的写作技巧。 - Nick
1
不错的想法。已更改。 - Damien Overeem
谢谢。我认为你刚刚让它更加清晰明了。 - BlitZ
显示剩余7条评论
3个回答

12

来自php.net

echo实际上不是一个函数(它是一种语言结构),因此您不需要在其后使用括号。

如果您想向echo传递多个参数,则这些参数不能用括号括起来。

示例:

<?php
echo(1);        // < works fine
echo(1, 2, 3);  // < Parse error: syntax error, unexpected ',' on line 3
echo 1;         // < works fine
echo 1, 2, 3;   // < works fine
echo (1), (2), (3);   // < works fine

关于你的问题“为什么两种方法都存在?”,使用大括号实际上并不是一种“方法”。这些大括号不属于echo,而是属于它的参数。在PHP中,几乎任何表达式都可以用大括号括起来。例如,($a = 1);$a = (1)都是有效的语句。所以这只是一个“额外的一对大括号”。就像在trim(($str));中,第一对括号属于函数,第二对括号属于它的参数。因此,现在你可以说使用带有大括号的echo与使用带有2对括号的trim()一样合理。
以上所有内容也适用于includerequirerequire_onceinclude_once,以及其他语言结构,但有一些例外。例如,isset虽然是一种语言结构,但由于某种原因需要一对括号。
请注意,正如include的手册页面中提到的那样,这些语言结构具有返回值。并且因为像include 'fileA.php' == 'OK'这样的表达式不明显(根据运算符优先级),在检查返回值时,您应该使用括号,可以将整个表达式括起来:(include 'fileA.php') == 'OK'或仅包装参数:include('fileA.php') == 'OK'

到目前为止,最佳答案,感谢@Corrupt。我仍然想知道为什么开发人员以函数式方式使用“语言结构”。特别是因为它的行为不同。这只是PHP开发历史上的“偶然事件”吗?还是背后有一个很好的原因? - Damien Overeem
@Damien Overeem,可能存在向后兼容性问题。 - BlitZ
@Damien Overeem,我已经更新了答案,并测试了 variable function 的调用。 - BlitZ
不错的发现。这使得echo();的存在更加尴尬。它可以工作,但具有完全意料之外的行为... - Damien Overeem
@Damien Overeem 是的,我也没有使用它,但某人在某些难以理解的方式下可能会使用它。除非不在弯曲的手中,否则它不是evUl - BlitZ
显示剩余3条评论

2

来自PHP文档

echo不是一个函数(它是一种语言结构),因此您不必使用括号。与某些其他语言结构不同,echo不像函数那样运行,因此它不能在函数上下文中始终使用。另外,如果要向echo传递多个参数,则参数不能被括在括号中。

它不是一个函数,因此不需要括号。


0

因为“because”是一个语句(语言结构),而不是函数。因此,为了区分函数和语句,它被使用如下。


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