web-dev-qa-db-ja.com

PHP "or"構文

私はこれをよく見ました:$fp = fopen($filepath, "w") or die();しかし、この「または」構文に関する実際のドキュメントを見つけることができないようです。それが何をするかは十分明らかですが、どこでも使用できますか?そして、その後にdie()が続かなければなりませんか?次のようなものを使用できる場合にorを使用する場合の注意事項はありますか

if (file_exists($filepath))
   $fp = fopen($filepath,"r");
else
   myErrMessage();

それはばかげた質問のように思えますが、これに関する厳格なルールを見つけることはできません。ありがとう。

35
Andrew

これは論理演算子であり、任意の論理式で使用できます。

http://php.net/manual/en/language.operators.logical.php

15
Smamatti

それを言ってみましょう:

$result = first() || second();

に評価されます:

if (first()) {
    $result = true;
} elseif (second()) {
    $result = true;
} else {
    $result = false;
} 

一方:

$result = first() or second();

に評価されます:

if ($result = first()) {
    // nothing
} else {
    second();
}

言い換えれば、あなたは考慮するかもしれません:

$result = first() || second();

$result = (first() || second());

そして:

$result = first() or second();

することが:

($result = first()) || second();

それはただの優先事項です。

12
tacone

これは、PHP前身から継承された、PHPが最初に返されたORに続く式をまったくスマートに評価しないという事実に基づいて、 true:

function a($ret){
    echo "FOO";
    return $ret;
}
function b($ret){
    echo "BAR";
    return $ret;
}

$result = (a(true) OR b(true));

FOOのみを出力します。つまり、b()は実行されなかったということです。

6

orは、単に boolean 比較を行います。

fopen()によって返されるものは、そのようなブール値として扱うことができます。これは、失敗するとFALSEを返すためです(失敗しない場合は異なる値を返します)。

失敗した場合、ステートメントは右側で評価されるため、関数die()が呼び出されます。

5
Chris

基本的には、「最初のコマンドが失敗した場合、2番目のコマンドを実行する」という意味です。あなたの例では、PHPがファイルを開けない場合、スクリプト(die())を終了します。

3
SenorAmor

PHPはCのような構文(||)に似ています

<?php 
if( ($a==1 || $a==2) && ($b==3 || $b==4) && ($c==5 || $c==6) ) { 
     //do that something here. 
} 
?>

あなたが話している「Or」は、次のように単なるトリックです。

例:

$result = mysql_query('SELECT foo FROM bar', $db) or die('Query failed: ' . mysql_error($db));

Or die()トリックは、いくつかの理由で非常に悪い選択です。

  1. ユーザーにエラーメッセージを表示するのはあまり良い方法ではありません。
  2. 何らかの方法でエラーをキャッチすることはできません。
  3. エラーをログに記録できません。
  4. 画面に出力するかどうかを制御することはできません。開発環境でそれをしても構いませんが、実稼働環境ではそうではありません。

    5。これにより、あらゆる種類のクリーンアップを実行できなくなります。スクリプトが突然終了するだけです。

参照:[ここにリンクの説明を入力してください] [1]

[1]: http://www.phpfreaks.com/blog/or-die-must-dieenter code here

3

使用するのと同じように使用できます||論理としてOR http://php.net/manual/en/language.operators.logical.php

1
Exupery

||として使用できますが、優先順位は同じではありません: http://www.php.net/manual/en/language.operators.precedence.php

演算子の優先順位は、2つの式をどの程度「厳密に」バインドするかを指定します。たとえば、式1 + 5 * 3では、乗算( "*")演算子は加算( "+")演算子よりも優先順位が高いため、答えは18ではなく16です。必要に応じて、括弧を使用して優先順位を強制することができます。たとえば、(1 + 5)* 3は18と評価されます。

0