2011-08-30 89 views
2

处理故障的常用方法是:'或'被视为返回语句的布尔检查吗?

$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?
+0

感谢大家的好的答案。在这种情况下,“短路评估”的使用并没有真正发生,但总体上是有意义的。下面关于'null'和'false'返回可能性差异的讨论正是我所期待的。谢谢 –

回答

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

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

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

1

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

考虑一下,如果PHP没有短路,这将发生什么:

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

如果双方进行了评估/执行,那么该脚本会死,即使查询本身没有返回false。

1

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

0

或运行“不为0”(或在这种情况下,不为空)感,这对包括C++在内的许多语言都很常见。从http://www.intap.net/~drw/cpp/cpp03_04.htm,

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