使用 'or die()' 在 PHP 中出现错误时停止

2022-08-30 21:54:49

通常在PHP中,我看到:

$result = mysql_query($query) or die();

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

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

$name = "John Doe";
echo $name or "Anonymous";

不返回第一个值(“John Doe”),它返回 1。or

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


答案 1

在 PHP 中,变量赋值(等号)和函数都优先于运算符。这意味着首先执行函数,然后在比较中使用函数的返回值。反过来,当您将两个值/变量与运算符一起使用时,它会首先比较这两个值,然后返回一个布尔值。ororor

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

$result = mysql_query($query) or die();
  1. mysql_query($query)
    返回 DQL 查询的结果集(如 )或 DDL、DML 或 DCL 查询的布尔值(如 、、、和 )。SELECTCREATEDROPINSERTUPDATEDELETEALTER

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

  3. $result /* = ... */ 或 die();
    如果它是一个结果集或 ,则认为它为真(又名“真值”),因此满足条件并且语句在此处结束。否则,脚本会改用。trueordie()


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

因为字符串是非空的,因此是真实的,所以总是正确的,隐式转换为,因此输出。$name or "Anonymous""Anonymous"echotrue1

此示例中的评估顺序为:

$name = "John Doe";
echo $name or "Anonymous";
  1. $name = “John Doe”;
    非常简单 — 将字符串 John Doe 分配给 。$name

  2. $name或“匿名”
    PHP发现包含字符串John Doe,因此最终评估的是以下内容:$name

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

  4. 回声真 /* $name 或... */;
    转换为并打印数字 1。true1


答案 2

为什么要退货? 是正常的布尔运算符。 是 if 或者 评估为 和 否则。oror$a or $btrue$a$btruefalse

和 之间的区别在于,它具有更低的运算符优先级,甚至低于 。这就是为什么||oror=

$result = mysql_query($query) or die();

与 相同

($result = mysql_query($query)) or (die());

$result = mysql_query($query) || die();

与 相同

$result = (mysql_query($query) || die());

在您的情况下

echo $name or "Anonymous";

得到

(echo $name) or ("Anonymous");

您要查找的可能是三元运算符:

echo $name ?: 'Anonymous';

以上内容从 PHP 5.3 开始有效,如果您只有 PHP 5.2 使用:

echo $name ? $name : 'Anonymous';

推荐