是'或'被视为对语句返回的布尔检查?

时间:2011-08-30 14:35:16

标签: php

处理故障的常用方法是:

$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: 'or' statement on instruction fail: how to throw a new exception?

5 个答案:

答案 0 :(得分:2)

它们几乎相同。唯一的区别是$result在较长版本之后未定义,而在较短版本之后它将具有值FALSE

与大多数语言一样,PHP使用short-circuit evaluation实现布尔操作。如果左手值为true,则不会评估右手值,因此该函数不会运行。如果发生任何错误,则左侧值为FALSE,因此会对右侧进行评估。

答案 1 :(得分:2)

在你的情况下,由于short circuit evaluation它们完全相同,但如果返回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)

答案 2 :(得分:1)

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

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

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

如果双方都被评估/执行,那么即使查询本身没有返回false,脚本也会死亡。

答案 3 :(得分:1)

两种说法都是一样的。 PHP对布尔表达式使用短路评估。这意味着它仅在第一个表达式为false时计算表达式。这就是你可以将它用作简单控制结构的原因。 or也有非常低的优先级

答案 4 :(得分:0)

OR在“不是0”(或在这种情况下,非空)的意义上运行,这对于包括C ++在内的许多语言来说是很常见的。来自http://www.intap.net/~drw/cpp/cpp03_04.htm

  

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