PHPのIF文の&&とandについて
解決済
回答 3
投稿
- 評価
- クリップ 4
- VIEW 24K+
IF文の中で使用する論理演算子に && と and の2つの演算子を使っている事があります
基本的に同じ意味だと思うのですが、
コーディングを行う際に、どちらの演算子を使用するのが一般的なのでしょうか?
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
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マニュアルによればor
やand
は最も優先順位が低い演算子で最後に計算されます。
これを意識せずに使うと思わぬ不具合の原因になりえます。
実際にPSYSHにて検証したところ、and
やor
は常に最後に評価される事を確認できました。
$ 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 // 丸括弧で優先順位を指定すれば問題ない
and
とor
演算子はちょっと癖が強いですね。
まとめるとこんな感じです。
and
やor
は、&&
や||
と併用してはならない- 代入演算子より弱い
and
やor
は丸括弧で包む癖を付けた方が良いかも
とにかく質問文にある「&&
やand
構文が混ざっている」状況はあまりよろしくなく、
どちらでも良いから統一すべきだろうと思います。
とはいえ、演算子の優先順位による不具合は同じ行で混ぜない限りは十分制御可能であり、
思想の違う二人のエンジニアが同じ行を編集しなければ大きな問題は発生しないかと思います。
慌てて修正して不具合を盛り込まないように、まずはチーム内で情報共有&ゆっくり相談して統一していくようにしてください。
PHPのコーディング規約としてよく使われているPSRでは、
and
とor
、&&
と||
のどちらのペアを使うべきかという事には言及されていません。
なのでマイノリティとされてしまったand
やor
も使ってはならないといったルールはありません。
大事なのは同じファイル内やプロジェクト内で統一することです。
どちらに統一するべきかはプロジェクト内の文化や思想に強く影響されます。
CoffeeScriptのようにand
やor
を推奨する言語というのはあります。
ですので、普段からフロントエンドでCoffeeScriptを使っており、and
やor
演算子を採用しているのであれば、
PHPも同様にand
とor
を使い、&&
と||
は封印するというルールでうまくいくでしょう。
可読性の為にand
とor
を採用するチームというのはあります。
リーダー的なポジションの人とよく相談して決めてください。
もし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は有志の方が日本語翻訳を作成されているようで、
ページ内検索で探しましたが特にそういった記述は見受けられませんでした。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+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で質問しよう!
- ただいまの回答率 88.20%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
同じタグがついた質問を見る
関連ワード: php &&