18

我经常在 PHP 中看到:

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

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

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

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

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

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

4

7 回答 7

33

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

因此,本例中的求值顺序为:

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

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

  3. $result /* = ... */ or die();
    如果它是结果集或true,则认为它为真(也称为“真”),因此or满足条件并且语句到此结束。否则脚本将die()改为。


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

$name or "Anonymous"总是如此,因为字符串是非"Anonymous"空的,因此是真实的,echo隐式转换true1,因此输出。

此示例中的评估顺序为:

$name = "John Doe";
echo $name or "Anonymous";
  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。

于 2010-07-21T12:13:58.067 回答
2

为什么要or退货?or是一个普通的布尔运算符。$a or $btrueif$a$b评估为truefalse否则。

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

$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.2,则上述内容将从 PHP 5.3 开始工作:

echo $name ? $name : 'Anonymous';
于 2010-07-21T12:15:37.327 回答
2

我问这个问题后不久就想到了原因。这是关于运算符优先级的。=发生在 之前,or所以:

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

相当于:

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

不是:

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

就像在 Python 中一样。所以这:

$a = false or true;

将设置$a为 false,而不是 true,这势必会在将来的某个时候赶上我。

于 2010-07-21T12:34:07.337 回答
1

PHP 做了一些通常称为“类型杂耍”的事情。换句话说:PHP 为当前用例转换任何值的类型。由于字符串将被转换为“真”值,因此您的表达式返回真。但是echo想要打印一个字符串表达式并将“true”转换为1。在某些情况下有点烦人,但如果你知道,你也知道如何处理;)

顺便检查一下:http: //php.net/manual/en/types.comparisons.php

于 2010-07-21T12:15:42.540 回答
1

or子句首先被评估并返回一个echo输出的布尔值。如果要输出文本,则需要 if/else 构造,例如:

echo ($name ? $name : 'Anonymous');
于 2010-07-21T12:16:34.197 回答
0

那是因为echo不是一个函数,它是一种语言结构。它模仿成一个函数,但实际上不是:)

我永远不会像这样使用 die() ,这有点粗糙。你应该适当地处理你的错误,而不是仅仅摆脱困境。

于 2010-07-21T12:13:22.543 回答
0

如果您想将该行为复制并输出到屏幕/浏览器,则需要一个返回 TRUE 以外的内容的函数。printf() 可以为您做到这一点。

echo microtime."&lt;br&gt;";<
$str = "";
printf("%s",$str) or die();
echo "&lt;br&gt;".microtime();

如果 $str 为空、null 或 false,则 die() 将被调用,否则,脚本将完成执行。

于 2010-07-21T13:27:43.547 回答