論理演算子(PHP)

前回[比較演算子](http://qiita.com/tsukishimaao/items/b8ad2773f4373663b927)という「大きさ」を比べる演算子について勉強しました。ちょっと復習ですが、「比較演算子」で作った式の結果は「true/false」、日本語で言うと「真/偽」という「論理値」で帰ってきます。

その「論理値」の演算を行うのが「論理演算子」です。したがって理論演算子の演算結果もまた理論値(真/偽)となります。

ちょっと文章だと把握しづらいと思うので前回同様、「論理演算子」の種類を以下の表にまとめました。
<br>
##論理演算子の一覧

 演算子      |演算式| 説明 |
|:-----------:|:------------:|:------------:|
|    `&&`       |    `a && b`    |   aかつbの両方がtrueのときtrue    |
| 	 `and`     |     `a and b`    |   同上↑    |
|![名称未設定-1.png](https://qiita-image-store.s3.amazonaws.com/0/35975/caeef64d-0d4f-c31a-3c4b-9a25caae6964.png "名称未設定-1.png")|    ![名称未設定-2.png](https://qiita-image-store.s3.amazonaws.com/0/35975/7f1aefe0-044d-7578-c671-2ea516c63b46.png "名称未設定-2.png")|    aまたはb、またはその両方がtrueの時true     |
| `or`         |     `a or b`    |    同上↑      |
| `xor`        |     `a xor b`  |    aまたはbのどちらか片方だけがtrueの時にtrue    |
| `!`         |     `!a`         |   aがtrueならfalse、falseならtrue。(否定)    |

合計で6つ出て来ましたが、見てわかる様に以下↓


①

| 演算子      |演算式| 説明 |
|:-----------:|:------------:|:------------:|
|    `&&`       |    `a && b`    |   aかつbの両方がtrueのときtrue    |
| 	 `and`     |     `a and b`    |   同上↑    |


②

| 演算子      |演算式| 説明 |
|:-----------:|:------------:|:------------:|
|     ![名称未設定-1.png](https://qiita-image-store.s3.amazonaws.com/0/35975/1ba4c236-d3ee-6f5d-dddd-62736c0e0149.png "名称未設定-1.png")|    ![名称未設定-2.png](https://qiita-image-store.s3.amazonaws.com/0/35975/c3d6353f-8277-d7d9-5736-0b2c7e10ef68.png "名称未設定-2.png")|    aまたはb、またはその両方がtrueの時true     |
| `or`         |     `a or b`    |    同上↑      |

①、②を見てわかる様に、「演算の内容」は同じなのにそれぞれ2つの演算子が存在します。これについては構文の書き方が「`&&`と`||`」と「`and`と`or`」で若干異なってきます。詳細についてはおの後説明します。

## 「`&&`と`||`と`!`」を使った構文を試しに書いてみる

```php:php
<?php 
$test1 = TRUE;
$test2 = FALSE;

$hantei1 = $test1 && $test2;  //$test1かつ$test2の両方がtrueのときtrue。
$hantei2 = $test1 || $test2;  //$test1または$test2、またはその両方がtrueの時true。
$hantei3 = !$test1;           //$test1がtrueならfalse、falseならtrue。(否定)

var_dump($hantei1);
var_dump($hantei2);
var_dump($hantei3);

?>

```

```php:出力
bool(false)
bool(true)
bool(false)
```

####解説
①`$hantei1 = $test1 && $test2;`、、、これだと`&&`を挟んだ両方の変数が`true=真`の時`true`となる。という意味です。変数`$test1 = TRUE;`、変数`$test2 = FALSE;`と両者変数の中身は誓います。よって出力の結果は「false=偽」となります。

②`$hantei2 = $test1 || $test2;`、、、この場合①と同様、`||`を挟んだ両者の変数の値は違いますが、`||`の場合上の表を見てもわかる様に`aかつb、またはaとbのどちらかがtrue(真)ならばtrue`になるので出力は「true=真」となります。

③`$hantei3 = !$test1;`、、、、、、、、の`!`は変数`$test1`の否定を意味します。もともと`$test1 = TRUE`とあらかじめ設定していますので、`TRUE`の否定→つまり`FALSE`になります。※ここでのTRUEとFALSEはPHPコアモジュール定数です(だと思う)。

##「`&&`と`and`」を使った論理式の場合。
先ほども書いた様に、「`&&`と`and`」と「`||`と`or`」は同じ働きをする演算子です。
しかし「`and`と`or`」の場合構文の書き方が少し異なります。それでは先ほどやった(一つ上)論理式を「`and`と`or`」
を使って書いてみましょう。

```php:php
<?php 
$test1 = TRUE;
$test2 = FALSE;

$hantei1 = ($test1 and $test2);  //$test1かつ$test2の両方がtrueのときtrue。
$hantei2 = ($test1 or $test2);   //$test1または$test2、またはその両方がtrueの時true。

var_dump($hantei1);
var_dump($hantei2);

?>
```
```php:出力
bool(false)
bool(true)
```

####書き方の違いと理由
andとorを利用する場合は、`($test1 and $test2);`のように、論理式をカッコでくくる必要があります。その理由は、andとorの優先順位が代入の`=`より低いからです。論理式をカッコでくくらないで以下の様に書くと

```php:php
<?php 
$test1 = TRUE;
$test2 = FALSE;

$hantei1 = $test1 and $test2;  
$hantei2 = $test1 or  $test2;

var_dump($hantei1);
var_dump($hantei2);

?>
```

もしこの様にカッコでくくらないで書いてしまうと以下↓

```php:php
$hantei1 = $test1 and $test2;
```
の

```php:php
$hantei1 = $test1
```
が先に実行されそこで完結してしまいます。

よって

```
var_dump($hantei1);
var_dump($hantei2);
```

を実行すると

```php:出力
bool(true)
bool(true)
```

と誤った結果が出力されてしまいます。

そのため`&&`と`and`を演算子として使うときは論理式をカッコで括る必要が出て来ます。

##まとめ
以上の内容をカバーしておけば「論理演算子」については基本的に覚えるべき事として大きな漏れは無いかと思います。

演算子に関するシンタックスは細かいものまで全て丸暗記するのは難しいと思うので(というか私が勉強してて思ってる)、今の段階では大まかにカテゴリー分けしておいて、いざという時にすぐに確認できる様自分なりに整理しておくと役に立つかと個人的には思いました。

以上になります。