使用'或die()'来停止PHP中的错误

rjm*_*nro 18 php boolean-operations

通常在PHP中,我看到:

$result = mysql_query($query) or die();
Run Code Online (Sandbox Code Playgroud)

来自python,我知道为什么这应该工作,因为or如果在布尔上下文中为真,则返回第一个值,否则返回第二个值(请参阅).

但是当我在另一个上下文中尝试PHP中的上述技术时,例如:

$name = "John Doe";
echo $name or "Anonymous";
Run Code Online (Sandbox Code Playgroud)

or不返回的第一个值("张三"),则返回1.

为什么这在mysql_query()结果案例中有效,但在其他情况下却没有?在mysql_query()情况下使用是否不好(忽略我没有向用户返回有用错误的事实)?

Bol*_*ock 33

在PHP中,变量赋值(等号)和函数都优先于or运算符.这意味着首先执行函数,然后在or比较中使用函数的返回值.反过来,当你使用两个值/变量连同or运营商,它比较这两个值第一,然后返回一个布尔值.

因此,此示例中的评估顺序为:

$result = mysql_query($query) or die();
Run Code Online (Sandbox Code Playgroud)
  1. mysql_query($query)
    返回或者用于DQL查询如的结果集SELECT,或用于DDL一个布尔值,DML或DCL查询,例如CREATE,DROP,INSERT,UPDATE,DELETEALTER.

  2. $result = mysql_query($query)
    此查询执行的结果将分配给变量$result.

  3. $result /* = ... */ or die();
    如果它是结果集,或者true它被认为是真的(也就是"真理"),那么or条件就满足了,语句就在这里结束了.否则脚本会die()改为.


echo是一种语言结构,因此实际上不返回值,因此在进行or比较之前它不像函数那样运行.

由于$name or "Anonymous"始终是正确的,因为该字符串"Anonymous"非空,因此truthy的echo隐式转换true1,因此该输出.

此示例中的评估顺序为:

$name = "John Doe";
echo $name or "Anonymous";
Run Code Online (Sandbox Code Playgroud)
  1. $name = "John Doe";
    非常简单 - 将字符串John Doe分配给$name.

  2. $name or "Anonymous"
    PHP发现$name包含字符串John Doe,因此最终评估的内容如下:

  3. "John Doe" or "Anonymous"
    由于此处至少有一个字符串非空,因此它被认为是真实的,并且满足条件.然后该评估返回true.

  4. echo true /* $name or... */;
    转换true1并打印数字1.