通常在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()情况下使用是否不好(忽略我没有向用户返回有用错误的事实)?
答案 0 :(得分:33)
在PHP中,变量赋值(等号)和函数都优先于or
运算符。这意味着首先执行函数,然后在or
比较中使用函数的返回值。反过来,当您将两个值/变量与or
运算符一起使用时,它会比较两个值 first 然后返回一个布尔值。
因此,本例中的评估顺序为:
$result = mysql_query($query) or die();
<强> mysql_query($query)
强>
返回DQL查询的结果集,例如SELECT
,或DDL,DML或DCL查询的布尔值,例如CREATE
,DROP
,INSERT
,{{1 }},UPDATE
和DELETE
。
<强> ALTER
强>
此查询执行的结果将分配给变量$result = mysql_query($query)
。
<强> $result
强>
如果它是结果集或$result /* = ... */ or die();
,则认为它是真的(也称为“真理”),因此满足true
条件并且语句在此处结束。否则,脚本将or
代替。
die()
是一种语言结构,因此实际上并不返回值,因此在进行echo
比较之前它不像函数那样运行。
由于or
始终为真,因为字符串$name or "Anonymous"
非空,因此真实,"Anonymous"
隐式将echo
转换为true
,因此输出
此示例中的评估顺序为:
1
<强> $name = "John Doe";
echo $name or "Anonymous";
强>
非常简单 - 将字符串 John Doe 分配给$name = "John Doe";
。
<强> $name
强>
PHP发现$name or "Anonymous"
包含字符串 John Doe ,因此最终评估的内容如下:
<强> $name
强>
由于此处至少有一个字符串非空,因此它被认为是真实的,并且满足条件。然后,此评估将返回"John Doe" or "Anonymous"
。
<强> true
强>
将echo true /* $name or... */;
转换为true
并打印数字1。
答案 1 :(得分:2)
为什么or
会返回任何内容? or
是一个普通的布尔运算符。如果$a or $b
或true
评估为$a
而$b
评估为true
,则false
为||
。
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';
您正在寻找的可能是三元运营商:
echo $name ? $name : 'Anonymous';
如果你只使用PHP 5.2,上面的内容将从PHP 5.3开始工作:
{{1}}
答案 2 :(得分: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,这将在未来的某个时刻引起我的注意。
答案 3 :(得分:1)
PHP做了一些经常被称为“类型杂耍”的事情。换句话说:PHP转换当前用例的任何值的类型。由于字符串将转换为“true”值,因此表达式返回true。但echo希望打印一个字符串表达式并将“true”转换为1.在某些情况下有点烦人,但如果你知道它,你也知道如何处理;)
答案 4 :(得分:1)
首先计算or
子句并返回echo
输出的布尔值。如果要输出文本,则需要if / else结构,如:
echo ($name ? $name : 'Anonymous');
答案 5 :(得分:0)
这是因为echo不是函数,它是一种语言结构。它模仿成为一个功能,但它确实不是:)
我永远不会像这样使用die(),它有点粗糙。你应该妥善处理你的错误,不要只是拯救。
答案 6 :(得分:0)
如果您想将该行为和输出复制到屏幕/浏览器,则需要一个返回TRUE以外的函数。 printf()可以帮到你。
echo microtime."<br>";<
$str = "";
printf("%s",$str) or die();
echo "<br>".microtime();
如果$ str为空,null或false,则调用die(),否则脚本将完成执行。