teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

優先順位を動かしてみて検証

2018/05/29 16:17

投稿

miyabi-sun
miyabi-sun

スコア21445

answer CHANGED
@@ -7,19 +7,51 @@
7
7
 
8
8
  ---
9
9
 
10
+ 【追記&修正】 実際に動作させて検証してみた
11
+
10
12
  [演算子の優先順位 - PHPマニュアル](http://php.net/manual/ja/language.operators.precedence.php)
11
13
 
12
- PHPマニュアルによれば`or`や`and`は極めて高く、
14
+ PHPマニュアルによれば`or`や`and`は最も優先順位が低い演算子で最後に計算されます。
13
- `&&`や`||`より結合度が強いのはもちろん、代入演算子よりも強力で、
14
15
  これを意識せずに使うと思わぬ不具合の原因になりえます。
15
- (trueやfalseの判定に代入演算子使うなという意見もある)
16
16
 
17
+ 実際にPSYSHにて検証したところ、`and`や`or`は常に最後に評価される事を確認できました。
18
+
19
+ ```Bash
20
+ $ psysh
21
+ Psy Shell v0.8.14 (PHP 7.1.14 — cli) by Justin Hileman
22
+ New version is available (current: v0.8.14, latest: v0.9.4)
23
+
24
+ >>> false and true || true // 一般的な感覚だとandが先に結合されて(false || true)になりそうだが
25
+ => false // ||の方が優先順位が高い為(false and true)になりfalseを返す
26
+
27
+ >>> $hoge = false or true
28
+ => true
29
+ >>> $hoge
30
+ => false // ($hoge = false)が先に評価される為、$hogeにはfalseが代入される
31
+
32
+ >>> $huga = false || true
33
+ => true
34
+ >>> $huga
35
+ => true // (false || true)が先に評価される為、$hugaにはtrueが代入される
36
+
37
+ >>> $foo = (false or true)
38
+ => true
39
+ >>> $foo
40
+ => true // 丸括弧で優先順位を指定すれば問題ない
41
+ ```
42
+
43
+ `and`と`or`演算子はちょっと癖が強いですね。
44
+ まとめるとこんな感じです。
45
+
46
+ - `and`や`or`は、`&&`や`||`と併用してはならない
47
+ - 代入演算子より弱い`and`や`or`は丸括弧で包む癖を付けた方が良いかも
48
+
17
- 従って、質問文にある「`&&`や`and`構文が混ざっている」状況はあまりよろしくなく、
49
+ とにかく質問文にある「`&&`や`and`構文が混ざっている」状況はあまりよろしくなく、
18
50
  どちらでも良いから統一すべきだろうと思います。
19
51
 
20
- とはいえ、演算子の優先順位の強さは同じ行で両方使うケースしか発生しません。
52
+ とはいえ、演算子の優先順位による不具合は同じ行で混ぜない限りは十分制御可能あり、
21
- 思想の違う二人のエンジニアが同じ行を触る事で起こり得る問題ですので、直ちに重篤なエラーが出る事ありせん
53
+ 思想の違う二人のエンジニアが同じ行を編集しなければ大きな問題は発生しないかと思い
22
- ゆっくり相談して統一していくようにしてください。
54
+ 慌てて修正して不具合を盛り込まないように、まずはチーム内で情報共有&ゆっくり相談して統一していくようにしてください。
23
55
 
24
56
  ---
25
57
 

1

演算子の優先順位の考慮も追加

2018/05/29 16:17

投稿

miyabi-sun
miyabi-sun

スコア21445

answer CHANGED
@@ -7,9 +7,25 @@
7
7
 
8
8
  ---
9
9
 
10
+ [演算子の優先順位 - PHPマニュアル](http://php.net/manual/ja/language.operators.precedence.php)
11
+
12
+ PHPマニュアルによれば`or`や`and`は極めて高く、
13
+ `&&`や`||`より結合度が強いのはもちろん、代入演算子よりも強力で、
14
+ これを意識せずに使うと思わぬ不具合の原因になりえます。
15
+ (trueやfalseの判定に代入演算子使うなという意見もある)
16
+
17
+ 従って、質問文にある「`&&`や`and`構文が混ざっている」状況はあまりよろしくなく、
18
+ どちらでも良いから統一すべきだろうと思います。
19
+
20
+ とはいえ、演算子の優先順位の強さは同じ行で両方使うケースでしか発生しません。
21
+ 思想の違う二人のエンジニアが同じ行を触る事で起こり得る問題ですので、直ちに重篤なエラーが出る事はありません。
22
+ ゆっくり相談して統一していくようにしてください。
23
+
24
+ ---
25
+
10
- ですが、PHPのコーディング規約としてよく使われているPSRでは、
26
+ PHPのコーディング規約としてよく使われているPSRでは、
11
27
  `and`と`or`、`&&`と`||`のどちらのペアを使うべきかという事には言及されていません。
12
- なので別に`and`や`or`使ってはならないといったルールはありません。
28
+ なのでマイノリティとされてしまった`and`や`or`使ってはならないといったルールはありません。
13
29
 
14
30
  大事なのは同じファイル内やプロジェクト内で統一することです。
15
31
  どちらに統一するべきかはプロジェクト内の文化や思想に強く影響されます。
@@ -19,11 +35,11 @@
19
35
  PHPも同様に`and`と`or`を使い、`&&`と`||`は封印するというルールでうまくいくでしょう。
20
36
 
21
37
  可読性の為に`and`と`or`を採用するチームというのはあります。
22
- 別のチムにジョする際、気になる場合は同僚に問いかけてください。
38
+ ダー的なポョンの人とよく相談し決めてください。
23
39
 
24
40
  ---
25
41
 
26
- 因みにPSRに関てはこの記事を確認してください。
42
+ PSRを今から調べるのであれば、この記事を確認してください。
27
43
  [PHPのコーディング規約 PSR-0、PSR-1、PSR-2、PSR-3とは - 9ensanのLifeHack](http://9ensan.com/blog/programming/php/php-psr-coding-standards/)
28
44
 
29
45
  新しくPSR-4が追加されているようですが、