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

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

新規登録して質問してみよう
ただいま回答率
85.37%
PHP

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

Q&A

解決済

3回答

5369閲覧

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

mamezou

総合スコア98

PHP

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

0グッド

4クリップ

投稿2014/04/01 05:01

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

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

kenshiro

総合スコア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

mpyw

総合スコア5223

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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


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

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

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

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

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 // 丸括弧で優先順位を指定すれば問題ない

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/29 09:07

編集2018/05/29 16:17
miyabi-sun

総合スコア21194

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

acevif

2018/05/29 15:41

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

2018/05/29 15:50

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

2018/08/12 11:14

修正ありがとうございます。 私の勘違いではなかったのですね。 別件ですが、「...が先に評価される」という説明に違和感があります。 たとえば `$hoge = false or true` は `(($hoge = false) or true)` という文と等価な構造だと文法的に解釈されますが、 これは `($hoge = false)` の部分が他のなにかより先に評価されるということを保証しないのではないでしょうか。 PHPマニュアルには「演算子の優先順位や結合性は、あくまでも式のグループ分けだけを決めるものであり、評価順を決めるものではありません」とあります。 http://php.net/manual/ja/language.operators.precedence.php 私の理解では、演算子の結合の優先順位はあくまで文法的な(syntacticな)ルールで、 意味的なこと(semanticな; 評価や値を考えること)と直接関係ないものです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問