🐘

[PHP] 2種類の論理演算子 ─ && と and ─

意外と知られていないのだけど、PHP の論理演算子には &&||andor の 2 種類がある。

何が違うの?

マニュアルによれば、両者の違いは「優先順位」だそう。 andor よりも &&|| のほうが演算子としての優先順位が高い。

どちらも挙動は同じなので、好きなほうを使っていいのだけど、andor を使うときは注意すべきことがある。 それは、andor の優先順位が代入演算子 (=, +=, *= など) よりも低いこと。

以下のコードを見ると違いがわかりやすい。

echo $a = true && false;
echo var_dump($a);
#==> bool(false)

echo $a = true and false;
echo var_dump($a);
#==> bool(true)

&&= よりも優先順位が高いので、$a = (true && false) となり、$a には false が入る。

しかし、and= よりも優先順位が低いので、($a = true) && false となり、$a には true が入る。

どっちを使うべき?

PSR にはどちらを使えという指定はない。 ただ、Laravel では &&|| が使われているので、&&|| を使うのが一般的と考えて良さそう。

andor の使いどころを考えている人がいた1が、効果的な使い分けはない様子。 Python は andor だし、どちらを使うのかは可読性や仕様を鑑みて、プロジェクトメンバーと話し合ってみるといいかもしれない。 少なくとも、プロジェクト内で統一する必要はある。

個人的には、$a = true && false$a = (true && false) であってほしいので、&&|| を使うことにする。