PHPでは「do OR OR DIE()」はどのように機能しますか?


99

私は、MySQLデータベースにアクセスするためのphpアプリを書いており、チュートリアルでは、次のような形式のメッセージが表示されます

mysql_connect($host, $user, $pass) or die("could not connect");

PHPは、関数が失敗したことをどのようにして認識し、ダイパーツを実行しますか?私はそれの「または」部分がどのように機能するかを尋ねていると思います。今まで見たことがないと思います。


3
余談ですが、実際のアプリケーションではこの種のロジックを使用しないでください。それでも、いくつのチュートリアルがそれをするのか、私はまだ驚きます。
エランガルペリン

2
使ってみませんか?それは本当に素晴らしくて読みやすいです...
rkj 09年

11
これは簡単でチュートリアルに適しているかもしれませんが、実際のユーザーの前に表示されるようなエラーメッセージが表示されてスクリプトが異常終了することは望ましくありません。カスタムエラーページを表示する(実際のエラーを指定せずに!)+エラーのロギングは必須です。
エランガルペリン

4
私は「死ぬ」ではなく「または」について話している。
Artelius 2009年

21
mysql_connect($ host、$ user、$ pass)またはPrintNiceError( 'DatabsaeConnectionError');
マッピー2009年

回答:


133

最初のステートメントがを返した場合、ステートメントtrue全体trueが2番目の部分で実行されることはないため、実行する必要はありません。

例えば:

$x = 5;
true or $x++;
echo $x;  // 5

false or $x++;
echo $x; // 6

したがって、クエリが失敗した場合は、die()ステートメントが評価され、スクリプトが終了します。


1
良い説明。このPHPの「暗黙の」言語構造は少し危険です。実行すると考えられても実際には実行されないステートメントがある可能性があり、ifブロックがある場合ほど明確ではありません。
ペトルザ2009

6
これは短絡評価と呼ばれ、PHP以外の言語でも役立ちます。
グリーバー氏、2011

1
ちなみに、ORの後には1つのステートメントしか使用できません。ブロックステートメントは構文チェックに失敗します(たとえば、実際のエラーメッセージは解析エラーになる可能性があります:構文エラー、予期しない '{'が...)
Scott Chu

そして、私はこれがpythonのwithステートメントのようなある種の高度な機能だと思っていましたが、それは実際にはブール式だけです...エラー。私が間違っている場合は修正してください。もしそうfunc_call($file) or die();して関数が失敗した場合、スクリプトが終了してもファイルは開いたままになります。
pedromanoel 2012年

@Petruza が機能orするif可能性のある状況で使用するのも良い習慣ですか?
limeandcoconut 2015

32

PHPはorCと同様に機能します||(偶然にもPHPでもサポートされています- or見栄えがよく、演算子の優先順位が異なります - このページを参照してください)。

最終値を決定するのに十分な情報が得られると評価をスキップするため、短絡演算子と呼ばれます。

あなたの例では、mysql_connect()がTRUEを返す場合、PHPはステートメント全体がTRUEに評価されることをすでに知っているため、評価対象が何でdie()あれ、die()評価されません。

場合はmysql_connect()返すFALSE、PHPは、それがevaluteにに行くとしようとして文全体がTRUEまたはFALSEに評価されるかどうかわからないdie()-プロセス内のスクリプトを終了します。

これは、or機能のしくみを利用した素晴らしいトリックです。


ショートサーキットに名前を付けるための+1。「副作用」という名前も付いているかもしれません。die()の戻りコードにはまったく関心がなく、その実行の効果だけが必要です。(これは常にdie()になるとは限りません)。一部の効果が不明瞭になる可能性があるため、これは常に純粋主義者に人気があるわけではありません。
mckenzm 2016

そして、これはすべてではありません。また、を使用して、1つを確実に機能させてから2つ目の機能を実行することもできます。
My1

11

他の人が説明したように動作します。

PHPでは、「Perlの場合のように」例外が発生しないため、「die」を使用しないでください。代わりに、通常の方法で適切に例外をスローします。

dieはPHPに捕まることができず、ログに記録されません。代わりにメッセージが不自然に出力され、何も言わずにイベントを記録したり、再試行したりする機会を与えずに、スクリプトが直ちに終了します。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.