处理故障的常用方法是:
$result = mysql_query("SELECT * FROM table1") or myFailureFunction();
结果是当查询失败时,调用myFailureFunction()
。
是否存在以下代码不完全相同的情况?
$result = mysql_query("SELECT * FROM table1");
if(!$result)
{
myFailureFunction();
}
指出:
- 我已经测试了连接失败,SQL语法失败和空结果,它似乎适用于所有这些。我想知道是否有任何情况下它不会工作。
- 我知道有更好的方法处理失败。
- 有一个关于
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
。
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"为假,任何非零的值都为真。