当与echo和return连接时,句点和逗号之间的差异?

omg*_*omg 54 php compare function concatenation language-construct

我发现这会起作用:

echo $value , " continue";
Run Code Online (Sandbox Code Playgroud)

但这不是:

return $value , " continue";
Run Code Online (Sandbox Code Playgroud)

而"." 适用于两者.

句号和逗号之间有什么区别?

Gum*_*mbo 68

return只允许一个表达式.但是echo允许表达式列表,其中每个表达式用逗号分隔.但请注意,由于echo不是函数而是特殊语言构造,因此将表达式列表括在括号中是非法的.

  • 但是,如果只有参数,echo确实允许使用括号 (9认同)
  • @Pacerier括号将包装列表中的第一个表达式,就像您可以将任何表达式包装在其他括号中一样. (2认同)

Mr.*_*Web 31

您还必须注意,echo因为构造使用逗号比使用点更快.

因此,如果你加入一个角色400万次,这就是你得到的:

echo $ str1,$ str2,$ str3;

大约2.08秒

echo $ str1.$ str2.$ STR3;

大约3.48秒

这是因为带有点的PHP 首先连接字符串然后输出它们,而逗号只是一个接一个地打印它们.

资源

  • 我喜欢你的解释.奇怪的是我已经编写PHP多年了,从来不知道你可以用逗号分隔.我总是用点. (20认同)

GSt*_*Sto 19

.是PHP中的连接运算符,用于将两个字符串放在一起.逗号可用于多个输入以进行回声.

  • 在这方面它不是一个连贯,它只是一个变量或蜇的'列表'来回应...... (2认同)

Pat*_*ins 11

Dot(.)用于连接变量或字符串.这就是为什么它在连接两个字符串时回显的原因,并且当你在方法中返回一个字符串的串联时它可以工作.但是逗号没有连接,这就是return语句不起作用的原因.

echo 是一个语言结构,可以采用多个表达式,这就是逗号的工作原理:

void echo ( string $arg1  [, string $...  ] )
Run Code Online (Sandbox Code Playgroud)

使用点进行连接


kni*_*ttl 7

echo是一个语言构造(不是一个函数),可以采取多个参数,这就是为什么,工作.使用逗号会稍微均匀(但只有几纳秒,没什么可担心的)

. 是字符串的连接运算符(粘合剂)


Kib*_*bee 5

echo 实际上是一个函数(不是真的,但让我们说它是用于参数),它接受任意数量的参数并将它们连接在一起.

虽然return不是一个函数,而是一个关键字,它告诉函数返回值,并且它试图将其解释,为某种运算符..在使用return语句时,您应该使用连接运算符.


Fat*_*ror 5

值得一提的是,串联运算符.比许多其他运算符具有更高的优先级,并且与+and-运算符具有相同的优先级

为什么这很重要?

好吧,废话不多说,让我向您展示代码(来自PHP 文档

$x = 4;
// this line might result in unexpected output:
echo "x minus one equals " . $x-1 . ", or so I hope\n";
// because it is evaluated like this line:
echo (("x minus one equals " . $x) - 1) . ", or so I hope\n";
// the desired precedence can be enforced by using parentheses:
echo "x minus one equals " . ($x-1) . ", or so I hope\n";
Run Code Online (Sandbox Code Playgroud)

事实上,从 PHP 7.4.0 开始,第一行将发出一条弃用消息

已弃用:同时包含“.”的无括号表达式的行为 和 '+'/'-' 将在 PHP 8 中发生变化:'+'/'-' 将具有更高的优先级

因此,在 PHP 8 中,这种情况下的关联性问题似乎可以通过给予+-运算符更高的优先级来解决。

那么我们现在可以说.,使用 echo 时给出相同的结果吗?

不,他们不会总是给出相同的结果

我们以这个案例为例

echo ' Here\'s ' . $name ?? 'Johnny';
Run Code Online (Sandbox Code Playgroud)

这里我们使用了Null 合并运算符,因此如果 $name 存在并且不为 NULL,它将被返回,否则将返回 Johnny。乍一看,人们可能会认为结果将是Here's Johnny,因为 $name 未定义,或者他们希望如此。

实际上结果会是

PHP Notice:  Undefined variable: name
Here's 
Run Code Online (Sandbox Code Playgroud)

这里发生的情况是,??运算符的优先级低于,这.意味着 PHP 将首先尝试计算(Here's $name)

您可以通过将表达式括在括号中来解决此问题

echo ' Here\'s ' . ($name ?? 'Johnny');
Run Code Online (Sandbox Code Playgroud)

或者直接使用逗号。

echo ' Here\'s ' , $name ?? 'Johnny';
Run Code Online (Sandbox Code Playgroud)

  • 您的评论中有很多有价值的信息!:) (2认同)