PHPで条件指定のスクリプトを記述するとき、皆さんはどのような論理演算子を使っているでしょうか。おそらくほとんどの人は「&&」「||」「!」を使用していると思います。

 PHPにはこれ以外にも数種類の論理演算子が存在するのをご存知でしょうか。

 PHPで使用可能な論理演算子は以下の6種類です。

&&  ・・・ 論理積
||  ・・・ 論理和
and ・・・ 論理積
or  ・・・ 論理和
xor ・・・ 排他的論理和
!   ・・・ 否定

 あまり見かけることの無い「排他的論理和」は、$a xor $b とした場合、$a と $b のどちらか片方が true の場合のみ true を返す演算子です。

<?php
var_dump
(false xor false);
var_dump(false xor true);
var_dump(true  xor false);
var_dump(true  xor true);
?>

実行結果:
bool(false)
bool(true)
bool(true)
bool(false)

 排他的論理和はビット演算で求める方法もあります。この場合、使用する演算子は「^」になります。

<?php
var_dump
(false false);
var_dump(false true);
var_dump(true  false);
var_dump(true  true);
?>

実行結果:
int(0)
int(1)
int(1)
int(0)

 ビット演算を使用するため、出力結果はint型になります。

 演算子の一覧を眺めていると、あれ?「&&」と「and」、「||」と「or」って同じじゃないの? と気付いた方もいるかと思います。実はこの2種類は、判定自体は一緒なのですが、実行される優先度が違うのです。

 「&&」 は 「and」 よりも優先度が高く、「||」 は 「or」 よりも優先度が高く設定されています。

 そのため、下記のスクリプトのように、2種類の論理積演算子・論理和演算子が混在する判定処理を記述すると、判定結果が変わってしまうことがあります。

<?php

$a 
false;
$b true
$c false;
$d true

var_dump($a and $b and $c || $d); 
var_dump($a &&  $b and $c or $d); 

?>

実行結果:

bool(false)
bool(true)

 このようなスクリプトは書くことはまず無いとは思いますが、論理演算子を使用する際は注意するようにしましょう。



(アシアル 松田惇)


この記事は、アシアルが運営するPHP開発者のためのポータル&コミュニティサイト「PHPプロ!」で毎週配信しているPHP・TIPSメーリングリストを再録したものです。
同サイトでは、他にもPHP最新ニュースや、困ったときのQ&A掲示板、初心者向けのPHP講座など、PHP開発者をサポートする情報を掲載しています。