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)
mysql_query($query)
返回或者用于DQL查询如的结果集SELECT,或用于DDL一个布尔值,DML或DCL查询,例如CREATE,DROP,INSERT,UPDATE,DELETE和ALTER.
$result = mysql_query($query)
此查询执行的结果将分配给变量$result.
$result /* = ... */ or die();
如果它是结果集,或者true它被认为是真的(也就是"真理"),那么or条件就满足了,语句就在这里结束了.否则脚本会die()改为.
echo是一种语言结构,因此实际上不返回值,因此在进行or比较之前它不像函数那样运行.
由于$name or "Anonymous"始终是正确的,因为该字符串"Anonymous"非空,因此truthy的echo隐式转换true到1,因此该输出.
此示例中的评估顺序为:
$name = "John Doe";
echo $name or "Anonymous";
Run Code Online (Sandbox Code Playgroud)
$name = "John Doe";
非常简单 - 将字符串John Doe分配给$name.
$name or "Anonymous"
PHP发现$name包含字符串John Doe,因此最终评估的内容如下:
"John Doe" or "Anonymous"
由于此处至少有一个字符串非空,因此它被认为是真实的,并且满足条件.然后该评估返回true.
echo true /* $name or... */;
转换true到1并打印数字1.