質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.61%

  • PHP

    19848questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

PHPのIF文の&&とandについて

解決済

回答 3

投稿

  • 評価
  • クリップ 3
  • VIEW 13K+

mamezou

score 146

職場でPHPのソースコードを読んでいて、
IF文の中で使用する論理演算子に && と and の2つの演算子を使っている事があります
基本的に同じ意味だと思うのですが、
コーディングを行う際に、どちらの演算子を使用するのが一般的なのでしょうか?
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+8

論理積は && を使う方が一般的です。

同じく論理和についても || と or と用意されていますが、
論理和については || が一般的に使われます。

意図せずに && and 両方を使ってコーディングを行うと思わぬ動きをしてしまいます。

 //例1:
if(true && true || true && false){
    echo "true";
}else{
    echo "false";
}

 //例2:
if(true and true || true and false){
    echo "true";
}else{
    echo "false";
} 

上記の結果として、
例1の(true && true || true && false)の結果はTRUEになりますが、
例2の(true and true || true and false)の結果はFALSEになります。 

これは、使用する演算子によって、演算の際に優先される順位が違う為、結果が変化します。
or << and << || << && の順で、優先順位が高くなります。

そのため、例1の処理順序は 
((true && true) || (true && false));
↓
(true || false)
↓
(true)
という流れになり、

例2は、
((true) and (true || true) and (false));
↓
((true and true) and (false))
↓
(true and false)
↓
(false)

となります。 

論理演算子の使い方については、職場のコーディングルールに明記されていなければ、
相談して追加してみてはいかがでしょうか

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

laravel/installerプロジェクトの
installer/src/NewCommand.phpファイルにて、
&&||を利用して記述している事を確認しました。

こちらの書き方を一般的と呼んでも良さそうです。
C言語を始めとするALGOL系言語は大抵論理演算子として&&||を採用している言語が多いようです。


【追記&修正】 実際に動作させて検証してみた

演算子の優先順位 - PHPマニュアル

PHPマニュアルによればorandは最も優先順位が低い演算子で最後に計算されます。
これを意識せずに使うと思わぬ不具合の原因になりえます。

実際にPSYSHにて検証したところ、andorは常に最後に評価される事を確認できました。

$ psysh
Psy Shell v0.8.14 (PHP 7.1.14 — cli) by Justin Hileman
New version is available (current: v0.8.14, latest: v0.9.4)

>>> false and true || true // 一般的な感覚だとandが先に結合されて(false || true)になりそうだが
=> false // ||の方が優先順位が高い為(false and true)になりfalseを返す

>>> $hoge = false or true
=> true
>>> $hoge
=> false // ($hoge = false)が先に評価される為、$hogeにはfalseが代入される

>>> $huga = false || true
=> true
>>> $huga
=> true // (false || true)が先に評価される為、$hugaにはtrueが代入される

>>> $foo = (false or true)
=> true
>>> $foo
=> true // 丸括弧で優先順位を指定すれば問題ない

andor演算子はちょっと癖が強いですね。
まとめるとこんな感じです。

  • andorは、&&||と併用してはならない
  • 代入演算子より弱いandorは丸括弧で包む癖を付けた方が良いかも

とにかく質問文にある「&&and構文が混ざっている」状況はあまりよろしくなく、
どちらでも良いから統一すべきだろうと思います。

とはいえ、演算子の優先順位による不具合は同じ行で混ぜない限りは十分制御可能であり、
思想の違う二人のエンジニアが同じ行を編集しなければ大きな問題は発生しないかと思います。
慌てて修正して不具合を盛り込まないように、まずはチーム内で情報共有&ゆっくり相談して統一していくようにしてください。


PHPのコーディング規約としてよく使われているPSRでは、
andor&&||のどちらのペアを使うべきかという事には言及されていません。
なのでマイノリティとされてしまったandorも使ってはならないといったルールはありません。

大事なのは同じファイル内やプロジェクト内で統一することです。
どちらに統一するべきかはプロジェクト内の文化や思想に強く影響されます。

CoffeeScriptのようにandorを推奨する言語というのはあります。
ですので、普段からフロントエンドでCoffeeScriptを使っており、andor演算子を採用しているのであれば、
PHPも同様にandorを使い、&&||は封印するというルールでうまくいくでしょう。

可読性の為にandorを採用するチームというのはあります。
リーダー的なポジションの人とよく相談して決めてください。


もしPSRを今から調べるのであれば、この記事を確認してください。
PHPのコーディング規約 PSR-0、PSR-1、PSR-2、PSR-3とは - 9ensanのLifeHack

新しくPSR-4が追加されているようですが、

  • PSR-0: オートローダーの為のコーディング規約 ←本題とは関係ない
  • PSR-1: 基本的なコーディング規約
  • PSR-2: コーディングスタイル規約(PSR-1に準拠する事が前提)
  • PSR-3: ログのインターフェース規約 ←本題とは関係ない
  • PSR-4: ファイルパスからクラスをオートロードするための仕様 ←本題とは関係ない

上記の記事を確認すると、0〜2は有志の方が日本語翻訳を作成されているようで、
ページ内検索で探しましたが特にそういった記述は見受けられませんでした。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/30 00:41

    「PHPマニュアルによればorやandは極めて高く」とありますが、これはたぶん誤植で「andやorの優先順位が低い」ですね。

    知らんけど。

    キャンセル

  • 2018/05/30 00:50

    四則演算子より&&や||は弱いはずですね。
    おっしゃる通りで完全に勘違いです、修正しておきます。

    キャンセル

  • 2018/08/12 20:14

    修正ありがとうございます。
    私の勘違いではなかったのですね。

    別件ですが、「...が先に評価される」という説明に違和感があります。
    たとえば `$hoge = false or true` は
    `(($hoge = false) or true)` という文と等価な構造だと文法的に解釈されますが、
    これは `($hoge = false)` の部分が他のなにかより先に評価されるということを保証しないのではないでしょうか。

    PHPマニュアルには「演算子の優先順位や結合性は、あくまでも式のグループ分けだけを決めるものであり、評価順を決めるものではありません」とあります。
    http://php.net/manual/ja/language.operators.precedence.php

    私の理解では、演算子の結合の優先順位はあくまで文法的な(syntacticな)ルールで、
    意味的なこと(semanticな; 評価や値を考えること)と直接関係ないものです。

    キャンセル

+2

一時期こういうコードを書いていた時期がありました。andなら意図したように動きます。

if ($user = User::find(1) and $phone = $user->phone) {
    return $phone;
}

しかし今は素直に

if (($user = User::find(1)) && ($phone = $user->phone)) {
    return $phone;
}

と書いています。代入演算子より優先度が低いというのがほぼ唯一の用途だと思っていますが,結局可読性を低めるので出番は無さそうですね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    【PHP】ログインフォームとDBに関しての質問

    ログイン成功→db.php ログイン失敗→log001.phpをリダイレクト というプログラムを書いています。 問題点 1.空欄のままでもログイン成功してしまう 2.未入力のエラ

  • 受付中

    URLをパラメータからディレクトリ形式に変換したい

    PHP初心者です。DBからデータを取得し、パラメータを受け取って表示させるPHPファイルを作成中なのですが、ページのURLをディレクトリ形式に変換する方法がないかと模索しております

  • 解決済

    php 三項演算子 and

    三項演算子で複数の条件を指定することはできますか? $a = 1 $b = 2 $bool = $a == 1 and $b == 2 ? true : false a

  • 解決済

    条件にあわせたエラーのクエリを送りたい

    前回も同じこと質問したこもしれませんが、なんかやりたいこととちょっとすれ違った気がします。 コードにも書いたですが、resizeページでエラーチェックをして、そのエラーのクエ

  • 解決済

    PHP 簡易的な掲示板で、テキストファイルの編集について

    phpファイルとは別に、テキストファイルを同じディレクトリに作っています。 削除までは問題なく動作しましたが、編集機能(keijiban.txtから投稿番号を、編集番号としてPO

  • 解決済

    phpexcelの印刷時のヘッダー、右側出力について

    //ヘッダーの表示 $excel->getActiveSheet()->getHeaderFooter()->setOddHeader('テストシート'); とあり、ヘッダ

  • 解決済

    PHP: empty

    vauleA、vauleBどちらも空じゃない場合のコードを教えてください。 if (! empty($vauleA)) if (! empty($vauleB))

  • 解決済

    ビットの論理積について

    PHPのビット演算子である&がよく理解できません。マニュアルによると$a & $bは  $a および $b の両方にセットされているビットがセットされます こうあります。マニュ

同じタグがついた質問を見る

  • PHP

    19848questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

関連ワード: php &&