"or"和"||"之间有什么区别?

5
$conn = mysql_connect($db_host,$db_user,$db_password) || die('Connection to mysql failed');
mysql_close($conn);

在执行这段代码时,出现了以下警告。
PHP警告:mysql_close()期望第一个参数为资源类型,但在script.php文件的第45行中提供的是布尔类型。
$conn = mysql_connect($db_host,$db_user,$db_password) or die('Connection to mysql failed');
mysql_close($conn);

现在没有警告了吗?

1
不要使用mysql函数 -.- - jeremy
2
@Jeremy 这并不是一个非常有帮助的评论。我怀疑他使用 mysql 库不是出于恶意,他可能只是不知道有任何不使用它的理由。至少给他提供一些资源的链接(https://dev59.com/3Gcs5IYBdhLWcg3wcDaZ?rq=1),帮助他学习。 - Chris Hayes
@ChrisHayes 我有点懒了,不过你说得对。 - jeremy
可能是PHP中or运算符的行为的重复问题。 - deceze
2个回答

9

&&||逻辑运算符--用于布尔条件语句。如@towr和@ChrisHayes所指出的,您可以使用andor代替&&||语法,但优先级低于大多数其他运算符。

然而,在这种情况下,or完全不同--它是控制流程(参见第2.5.7节:退出和返回)的一部分。

布尔条件:

if ($foo == $bar || $bar != $bob)

控制流程:

mysql etc... or die();

由于您没有实际编写正确的语法,因此打破了mysql_connect语句,导致您收到“PHP警告:mysql_close()期望参数1为资源...”错误。

2
最佳答案应该涉及优先级,即使帖子没有询问它,提到优先级也不是直接回答问题。 - jeremy
另外,您能引用您的来源吗? - jeremy
3
我已经删除了我自己的回答,因为它有些误导性,但我认为应该更突出地解决@towr的观点。 andor 不是控制流的一部分,它们只是短路逻辑运算符,在大多数其他运算符之前以较低的优先级工作。 - Chris Hayes
1
你也可以使用 || 来完成同样的操作,例如 ($conn = mysql_connect(...) ) || die(":(")。因此,在流程控制方面,“或”并不是特殊的,尽管在这种情况下更容易使用。但我认为,为了完整起见,应该指出这两个语句实际上都将什么赋值给 $conn。 - towr
显示剩余2条评论

5

andor 的优先级比 &&||。更确切地说,&&|| 的优先级比赋值运算符(=)要,而 andor 则要

http://www.php.net/manual/en/language.operators.precedence.php

通常这不会有什么影响,但有些情况下,不了解这种差异可能会导致一些意外行为。在这里查看示例:

http://php.net/manual/en/language.operators.logical.php

编辑(由@towr建议):

应用于此问题,这意味着在第一种情况下,我们将$conn赋值为 mysql_connect(....) || die('....'),因为||的优先级高于=。问题在于$conn现在是一个布尔值,而不是资源。

在第二种情况下,我们使用OR表达式$conn = mysql_connect(....)die('....'),因为=的优先级高于OR。我们没有对布尔值进行任何操作,$conn只是我们在第一个表达式中分配给它的资源(如果它没有失败)。


3
@Jeremy,这是有区别的,因为$foo = $a || $b等同于$foo = ($a || $b)等同于$foo = ($a or $b),而$foo = $a or $b则等同于($foo = $a) || $b等同于($foo = $a) or $b - towr
嗯...那么将此应用于OP的问题。它如何回答呢? - jeremy
@Aks 这就是你要的。+1 - jeremy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接