2011-08-30 2 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

これらは実質的に同等です。唯一の違いは、短いバージョンの後にFALSEの値を持ちますが、$resultは長いバージョンの後では未定義です。

PHPは、ほとんどの言語と同様に、short-circuit evaluationを使用してブール演算を実装しています。左辺値が真の場合、右辺値は評価されないので、関数は実行されません。何らかのエラーが発生した場合、左側の値はFALSEであるため、右側が評価されます。

1

これらはまったく同じです。失敗関数は、mysql_queryがboolean falseを返す場合にのみ呼び出されます。この場合、PHPは短絡ブール評価を使用します。式全体の真偽結果が何であるかを把握するのに十分なデータがあれば、残りの評価を停止します。両側がクエリ自体はfalseを返さなかった場合でも、その後、スクリプトが死んでしまう、実行/評価された場合

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

はPHPが短絡これをしなかった場合はどうなるのか考えてみましょう。

1

どちらのステートメントも同じです。 PHPはブール式の短絡評価を使用します。つまり、最初の式がfalseのときだけ式を評価します。これが簡単な制御構造として使用できる理由です。 orも非常に低い優先度を持っています

0

ORで動作している(または、この場合は、nullではない)の意味、 "0でない" とC++を含む多くの言語に共通です。http://www.intap.net/~drw/cpp/cpp03_04.htmから

ブール演算子ではない変数に対してブール演算子を使用することは、C++では完全に正当です。 C++では、 "0"は偽であり、ゼロ以外の値はすべてtrueです。

関連する問題