& # 39;或# 39;在返回语句时作为布尔检查处理


Is 'or' treated as a boolean check on the return of a statement?

处理故障的常用方法是:

$result = mysql_query("SELECT * FROM table1") or myFailureFunction();

结果是当查询失败时,调用myFailureFunction()

是否存在以下代码不完全相同的情况?

$result = mysql_query("SELECT * FROM table1");
if(!$result)
{
    myFailureFunction();
}

指出:

  1. 我已经测试了连接失败,SQL语法失败和空结果,它似乎适用于所有这些。我想知道是否有任何情况下它不会工作。
  2. 我知道有更好的方法处理失败。
  3. 有一个关于or的布尔属性的问题。我想知道的是,or是否对返回的结果或其他东西进行操作?问题:PHP: '或'指令失败的语句:如何抛出一个新的异常?

在您的情况下,由于短路计算,它们完全相同,但是如果返回null或其他一些假值,则会产生差异。注意:

function f(){return false;} 
function w(){return "w";} 
$a = f() or w(); 
echo isset($a);
// 1 (true). $a === FALSE!

现在,注意缺少返回时会发生什么:

function f(){} 
function w(){return "w";} 
$a = f() or w(); 
echo isset($a);
// nothing (false)

它们实际上是等价的。唯一的区别是$result在较长版本之后没有定义,而在较短版本之后它的值为FALSE

和大多数语言一样,PHP使用短路求值实现布尔运算。如果左边的值为真,它不会计算右边的值,所以函数不会运行。如果发生任何错误,则左边的值为FALSE,因此导致计算右边的值。

它们完全相等。只有当mysql_query返回一个布尔值false时,才会调用失败函数。在这种情况下,PHP使用短路布尔求值。一旦它有了足够的数据来计算整个表达式的布尔结果是什么,它就停止对其余部分求值。

考虑如果PHP没有短路会发生什么:

$result = mysql_query(...) or die(mysql_error());

如果两边都求值/执行,那么即使查询本身没有返回false,脚本也会终止。

两个语句是相同的。PHP对布尔表达式使用短路求值。这意味着它只计算第一个表达式为假时的表达式。这就是为什么你可以用它作为简单的控制结构。or的优先级也很低

OR以"非0"(或者在本例中,不是null)的意义进行操作,这在包括c++在内的许多语言中都很常见。从http://www.intap.net/~ drw/cpp/cpp03_04.htm,

在c++中对非布尔值的变量使用布尔运算符是完全合法的。在c++中,"0"为假,任何非零的值都为真。