職場でPHPのソースコードを読んでいて、
IF文の中で使用する論理演算子に && と and の2つの演算子を使っている事があります
基本的に同じ意味だと思うのですが、
コーディングを行う際に、どちらの演算子を使用するのが一般的なのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
論理積は && を使う方が一般的です。
同じく論理和についても || と 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)
となります。
`
論理演算子の使い方については、職場のコーディングルールに明記されていなければ、
相談して追加してみてはいかがでしょうか
投稿2014/05/26 01:01
総合スコア409
0
一時期こういうコードを書いていた時期がありました。and
なら意図したように動きます。
php
1if ($user = User::find(1) and $phone = $user->phone) { 2 return $phone; 3}
しかし今は素直に
php
1if (($user = User::find(1)) && ($phone = $user->phone)) { 2 return $phone; 3}
と書いています。代入演算子より優先度が低いというのがほぼ唯一の用途だと思っていますが,結局可読性を低めるので出番は無さそうですね。
投稿2018/06/02 06:46
総合スコア5223
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
laravel/installerプロジェクトの
installer/src/NewCommand.phpファイルにて、
&&
と||
を利用して記述している事を確認しました。
こちらの書き方を一般的と呼んでも良さそうです。
C言語を始めとするALGOL系言語は大抵論理演算子として&&
や||
を採用している言語が多いようです。
【追記&修正】 実際に動作させて検証してみた
PHPマニュアルによればor
やand
は最も優先順位が低い演算子で最後に計算されます。
これを意識せずに使うと思わぬ不具合の原因になりえます。
実際にPSYSHにて検証したところ、and
やor
は常に最後に評価される事を確認できました。
Bash
1$ psysh 2Psy Shell v0.8.14 (PHP 7.1.14 — cli) by Justin Hileman 3New version is available (current: v0.8.14, latest: v0.9.4) 4 5>>> false and true || true // 一般的な感覚だとandが先に結合されて(false || true)になりそうだが 6=> false // ||の方が優先順位が高い為(false and true)になりfalseを返す 7 8>>> $hoge = false or true 9=> true 10>>> $hoge 11=> false // ($hoge = false)が先に評価される為、$hogeにはfalseが代入される 12 13>>> $huga = false || true 14=> true 15>>> $huga 16=> true // (false || true)が先に評価される為、$hugaにはtrueが代入される 17 18>>> $foo = (false or true) 19=> true 20>>> $foo 21=> 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は有志の方が日本語翻訳を作成されているようで、
ページ内検索で探しましたが特にそういった記述は見受けられませんでした。
投稿2018/05/29 09:07
編集2018/05/29 16:17総合スコア21194
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/05/29 15:50
2018/08/12 11:14
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。