こんにちは。いっとくです!
好きな食べ物は空豆を皮ごと塩焼きにしたやつ!
立派なPHPerになるため、今日もアウトプット!
今日の内容は基礎中の基礎でもあるPHPの論理演算子についてまとめてみました。
割と基礎的な内容なので、PHP学び始めの初心者の方はちらっと目を通して、もうそんな基礎はとっくのとうにわかってるからどうでもいいよ!っていう方は速やかに布団に入ってぬくぬくするのが有益です。
PHPで使われる論理演算子一覧
論理演算子っていう言葉の響きが難しそうなので、もうちょっと別のネーミングなかったんかね?という気もするんですが、論理演算子とは要するに右辺と左辺をチェックして、その状況に応じてオッケーかダメかを返す門番みたいなやつです。
PHPで使用することのできる論理演算子は以下の通り
演算子 | 意味 |
---|---|
&& | 両辺がTRUEだったらTRUE |
and | 両辺がTRUEだったらTRUE(&&と優先順位が違う) |
|| | 両辺のどちらかがTRUEだったらTRUE |
or | 両辺のどちらかがTRUEだったらTRUE(||と優先順位が違う) |
! | TRUE→FALSEに、FALSEをTRUEに変える |
xor | 両辺のどちらかがTRUEかつ、両辺ともにTRUEじゃない時にTRUE |
正直and、or、xorを使わなきゃいけないという自体に陥ることはそこまで多くないと思いますが、ソースコードをいじっている時、不意に出会っても戸惑わないようにするために頭の片隅に置いておくといいでしょう。
まずは基本!&&と||と!の挙動をみてみよう
ということで実際のソースコードをみた方がわかりやすいので、早速みていきましょう。
<?php
echo '<pre>';
// まずは&&の挙動
var_dump(TRUE && TRUE); // TRUE
var_dump(TRUE && FALSE); // FALSE
var_dump(FALSE && FALSE); // FALSE
//続いて||の挙動
var_dump(TRUE || TRUE); // TRUE
var_dump(TRUE || FALSE); // TRUE
var_dump(FALSE || FALSE); // FALSE
// そして!の挙動
var_dump(!TRUE); // FALSE
var_dump(!FALSE); //TRUE
こんな感じで出力されます。
使い道としてはif文で条件分岐をする際の条件式で、===や>などの比較演算子だったりempty関数のような条件に応じてTRUEかFALSEが返ってくる関数と合わせて使います。
これだけで概ねのことはなんとかなるのですが、今回はちょっとマニアックな部分にも踏み込んで解説したいと思います。
論理演算子の優先度について
論理演算子には優先度というものがあります。
基本的には左に書いたものからチェックされていくわけですが、優先度が高いものがあれば、そっちから優先的にチェックしているのです。
例えば以下のコード
<?php
echo '<pre>';
// 1
var_dump(TRUE || TRUE && FALSE); // TRUE
// 2
var_dump((TRUE || TRUE) && FALSE); // FALSE
1も2もTRUE・FALSEの順番や論理演算子の順番は同じですが、違う結果が出力されます。
これはPHPの中で、論理演算子の優先度が高い順にチェックされるようになっているからです。
&&は||よりも優先度が高いため、右側に書いてあったとしても先にチェックされるのですが、カッコでくくってあげることによって優先度をあげることができます。なので上記のような結果が出ます。
もし論理演算子で&&と||を併用する場合は順番を意識しないと、予想していたのと違う結果が出たりするので気をつけましょう。
また、先ほどの表にあったandとorは&&や||よりも優先順位が低く設定されています。
そのため、以下のように書いた場合も異なる動きをします。
<?php
echo '<pre>';
var_dump(TRUE || TRUE && FALSE); // TRUE
var_dump(TRUE || TRUE and FALSE); // FALSE
まぁ、流石にandと||を組み合わせることよりも、カッコでくくってあげた方が個人的には見やすい気はするし、既存のソースコードで見たこともないのでそこまでメジャーな書き方じゃないと思います。
優先順位を覚えておくことは地味に大事で、例えば条件分岐で変な動きするな〜と思ったら優先順位の違いで想定外の条件になってた!なんてことも慣れないうちはあったりするので、もっと詳しく知りたい人は公式マニュアルに目を通しておくと勉強になるはず。
ちなみに優先順位は全ての演算子につけられているため、優先度が最下級のandやorは+とか=よりも優先度が低く、下記のような使い方するとかなり予想外の動きをしたりするので気をつけましょう。
<?php
$bool = true and false;
$bool2 = false and true;
var_dump($bool); // TRUE
var_dump($bool2); // FALSE
andは=よりも優先度が低いので、変な結合の仕方になる。
基本的に優先度は意識しなくてもある程度直感でなんとかなりますが、知っておくに越したことはないでしょう。
めったに使わないxorの使い方を考えてみる
はい、とういわけで最後はこちら。
なんて読むの?ゾォア?
正直自分が今まで触ってきたソースコードにも出てきてないし、プログラミングを勉強していた時も見かけた記憶がないので、いざという時になにこれ!?ってならないように存在してることだけ把握しておけばいいような気もします。
恥ずかしながら自分もパーフェクトPHPを読んだ時に初めて知りました。
ちなみに読み方を調べてみたら、エックスオアって読むっぽい。SONOMAMA!!
しかしせっかく知ってしまったのでxorの使い道について考えてみます。
まずxorの動きは右辺か左辺のどちらか片方だけがTRUEの時にTRUEを返すというものです。
つまりこういうこと
<?php
echo '<pre>';
var_dump(TRUE xor TRUE); // FALSE
var_dump(TRUE xor FALSE); // TRUE
var_dump(FALSE xor FALSE); // FALSE
まぁ、動きはわかりましたわ。
でもこれだけだとちょっと実際の使い方がイメージわかない。どんなシーンで使えると嬉しいんだろうか?
そういうわけなので、ちょっとコードを書いてみました。
<?php
$mens = [
'takashi' => [
'年収' => 400,
'顔' => 'イケメン',
],
'mitsuo' => [
'年収' => 1500,
'顔' => '普通',
],
'hiroshi' => [
'年収' => 500,
'顔' => 'おブス',
],
'takuya' => [
'年収' => 2000,
'顔' => 'イケメン',
]
];
$sachiko = [
'理想の年収' => 800,
'理想の顔' => 'イケメン',
'苦手なタイプ' => '顔と年収を兼ね備えた逆に怪しい奴',
];
function sachikosCheck ($mens, $sachiko) {
foreach ($mens as $man => $hisStatus) {
if ($hisStatus['年収'] >= $sachiko['理想の年収'] xor $hisStatus['顔'] === $sachiko['理想の顔']) {
echo $man . 'めっちゃいい男ー!!';
} else {
echo $man . 'はちょっと、ごめんなさい…';
}
}
}
sachikosCheck($mens, $sachiko);
// takuya:顔がタイプ!
// mitsuo:年収がいい感じ!
// hiroshi:ちょっと基準に満たないわ
// takuya:完璧すぎて逆に自分が劣等感を感じるのよ!
婚活に来ている幸子は運命の相手を探すために、sachikosCheck関数を発動します。
幸子はイケメンが好きで、年収が高い方がいいと思っているが、ある男に裏切られたという過去のトラウマから、その両方の要素を兼ね添えた人に心を開くことができません…
そのためxor演算子で男を見極めようとするのです。
…
……
…結構本気で実用的な使い方考えたんですけど、マジでこんな感じの人間味溢れる条件分岐しか思いつかない!
完全に僕の力不足と想像力不足です。
しかしこのままでは気になりすぎて夜にならないと眠れない体になってしまいそうなので、xorの使い道について調べてみたのですが、どうやらPHPのような現在使われている高級言語で使うことはあんまりないっぽい!
どちらかというと、もっと原始的なプログラミングの時に色々と活用していたものっぽく、ビットなんちゃらでZ/zz??見たいなことが書いてあったので、読んでもよくわからん。とりあえず0と1の羅列をいい感じに反転させて、暗号化とかのアルゴリズムでツカウンダッテー。スゴシスゴシー。
まぁよくわかりませんが、PHPでプログラムを書く時には知らなくてもなんとかなります!!それがxor演算子!
もし、xorを使って、革命的に条件分岐をスッキリかける方法とかを知っている方がいらっしゃいましたら、コメント欄か何かを通じておバカな僕に教えていただけると幸いです、、、
はい、というわけで今日は基礎の基礎である論理演算子の使い方一覧とその優先順位とかのお話でした!
もしPHPを基礎から体系的に学びたい方は、かなり難読ですがパーフェクトPHPがかなり良かったので、興味があれば参考にしてみてください!
以上、いっとくでした!さよなら!
コメント