在 PHP 中,“!print(“1”)|| 1”的意外行为

4

例子1:

if(!print("1") || 1){
   echo "a";
}else{
   echo "b";
}

输出

1b

示例1 输出的是 "1b", 而不是 "1a"。在我看来,在解决了 !print("1") 后,最终条件应该是if(0 || 1)

但是示例2 输出的是 "1a"。

示例2:

if((!print("1")) || 1){
   echo "a";
}else{
   echo "b";
}

输出

1a

你能详细说明一下,为什么第一条语句中的或条件没有生效吗?


是的,但是首先有一个非运算符。 - Vinay Kharayat
1
这一定与print是“特殊”的有关。 print实际上不是一个函数,而是一种“语言结构”。手册说它总是返回1,但如果你用function p() {echo "1"; return 1;}替换它,那么上面的两个版本都会给你1a作为结果。您不需要在参数列表中使用括号,因此print(“1”)print“1”实际上是相同的东西。我想这一定对这里的效果有所贡献。 - CBroe
更奇怪的是: 在这两种情况下都替换为print("3"),第一种情况仍将得到1b,但第二种情况将得到3a - CBroe
!print "1" 的输出是 false,但也有一个“||”条件是 true,但它没有读取“||”条件。 - Vinay Kharayat
1
我认为这实际上被视为!print("1" || 1)"1" || 11,所以你从打印语句中得到它作为输出 - 然后返回值(也是 1,但是一个“不同的” 1)在此之后被否定。 - CBroe
1个回答

4
关键在于要认识到print不是函数,不需要用括号传递参数。这里的括号不是可选的,而是根本不属于语法的一部分。
当您编写print("1");时,打印语句有一个参数,即表达式("1")。 这只是写"1"的另一种方式 - 您可以添加任意数量的括号,它不会改变值。
因此,当您编写print("1") || 1时,打印的参数是表达式("1") || 1。 根据PHP的类型转换规则计算该表达式为true || true,即true。 然后将其传递给 print ,与您尝试打印的内容完全巧合,并被类型转换为字符串"1"
然后将打印语句视为返回true的表达式,!将其变为false,因此if语句不会运行。
这是不要在关键字旁边使用括号(如printrequireinclude)的一个好原因-它们会给人一种错误的印象,认为括号中的参数与关键字相关联。

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