【问题标题】:Difference between 'or' and '||'?“或”和“||”的区别?
【发布时间】:2014-01-24 19:19:51
【问题描述】:
$conn = mysql_connect($db_host,$db_user,$db_password) || die('Connection to mysql failed');
mysql_close($conn);

执行此代码时,显示以下警告。

PHP 警告:mysql_close() 期望参数 1 是资源,在第 45 行的 script.php 中给出布尔值

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

现在没有警告!?

【问题讨论】:

标签: php mysql


【解决方案1】:

&&||logical operators - 它们用于布尔条件语句。正如@towr 和@ChrisHayes 指出的那样,您可以使用andor 代替&&|| 语法,尽管优先级低于大多数其他运算符。

or 在这种情况下却完全不同——它是control flow (see section 2.5.7: exit and return) 的一部分。

布尔条件:

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

控制流程:

mysql etc... or die();

您收到错误“PHP 警告:mysql_close() 期望参数 1 是资源...”,因为您实际上并未编写正确的语法,从而破坏了您的 mysql_connect 语句。

【讨论】:

  • 最佳答案,但应该解决优先级,即使帖子没有询问它并且提及优先级不会直接回答这个问题。
  • 根据文档php.net/manual/en/language.operators.logical.php orand 也只是逻辑运算符,但它们的优先级与||&& 不同。
  • 另外,你能引用你的资料吗?
  • 删除了我自己的回答有点误导,但我认为@towr 的观点需要在这里更突出地解决。 andor 不是控制流的一部分,它们只是短路逻辑运算符,其工作优先级低于大多数其他运算符。
  • 可以也可以使用|| 来做同样的事情,即($conn = mysql_connect(...) ) || die(":(") 所以,or 在流量控制方面并不特别,尽管它更易于使用在这种情况下。但我认为要获得完整的答案,应该指出这两个语句实际上分配给 $conn 的内容。
【解决方案2】:

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 只是我们在第一个表达式中分配给它的资源(如果它没有失败的话)。

【讨论】:

  • @Jeremy 确实如此,因为这意味着$foo = $a || $b 等于$foo = ($a || $b) 等于$foo = ($a or $b) 而$foo = $a or $b 等于($foo = $a) || $b 等于($foo = $a) or $b
  • 嗯...所以将其应用于 OP 的问题。它是如何回答的?
  • @Aks 你去。 +1
猜你喜欢
  • 2016-11-07
  • 2015-03-29
  • 2016-04-02
  • 1970-01-01
  • 1970-01-01
  • 2011-09-09
  • 2012-11-05
  • 2013-08-01
  • 2018-12-15
相关资源
最近更新 更多