LoginSignup
1

More than 5 years have passed since last update.

posted at

updated at

論理演算子(PHP)

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

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

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

論理演算子の一覧

演算子 演算式 説明
&& a && b aかつbの両方がtrueのときtrue
and a and b 同上↑
名称未設定-1.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 名称未設定-2.png aまたはb、またはその両方がtrueの時true
or a or b 同上↑

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

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

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);

?>

出力
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」は同じ働きをする演算子です。
しかし「andor」の場合構文の書き方が少し異なります。それでは先ほどやった(一つ上)論理式を「andor
を使って書いてみましょう。

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);

?>
出力
bool(false)
bool(true)

書き方の違いと理由

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

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

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

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

?>

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

php
$hantei1 = $test1 and $test2;

php
$hantei1 = $test1

が先に実行されそこで完結してしまいます。

よって

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

を実行すると

出力
bool(true)
bool(true)

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

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

まとめ

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

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

以上になります。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1