PHPプロ!TIPS+

「論理演算子」使いこなしていますか

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)

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

バックナンバーについて

TIPS-MLは、毎週金曜日に更新され、新しい記事が掲載されます。

Tipsꗗy[W 

Pick Up Q&A

Q
PHPのHTML埋め込み記述について
 このエントリーをはてなブックマークに追加 
A
$_POST["data"] == "男" ? $val = "checked" : $val = "" ; の意味は以下と同じです。 if($_POST["data"] == "男"){ $val = "checked; } e...

>>続きを読む

kende様のご指摘通り、三項演算子を使用する際には、コードの複雑度などを考慮する必要がありますね。書きやすさと共に可読性も追求したいところですね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)