PHPプロ!TIPS+

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

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)

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

2. 比較演算子のパフォーマンス

PHPでの比較を行う場合、大抵は「==」「!=」を使用すると思います。ただし、巨大なデータを処理する際のパフォーマンスが問題になる場合は、「===」「!==」を使用することをオススメします。今回は2種類の演算子でのパフォーマンスの違いを見てみます。

「===」と「==」の違いは型が同じかどうかをチェックするかどうかです。「===」では型のチェックを行うので「12 === '12'」はfalseとなります。同様に「12 !== '12'」はtrueとなります。

型のチェックを行うのだから、パフォーマンスは「===」の方が低くなると思うかもしれませんが、実際は高いのです。「==」では型の変換処理を内部で実行しようとするためで、型の変換をしないで比較を行う「===」の方が高速なのです。

まずは以下のスクリプトを見てください。

<?php
$MAX 
10000000;
$hoge "abcdefg";
for (
$i 0$i $MAX$i++) {
  if (
$hoge == "abcdefg")
}

これを test_default.php とします。「===」を使用したスクリプトをtest_strict.php とします。これをtimeコマンドを使用して調べます。また、基本部分の実行スピードを調べるために、以下のtest_base.phpも使用します。

<?php
$MAX 
10000000;
$hoge "abcdefg";
for (
$i 0$i $MAX$i++) {
//  if ($hoge == "abcdefg")
}

テストの結果は以下のようになりました。

$ time php test_default.php
real    0m4.785s
user    0m4.771s
sys     0m0.009s

$ time php test_strict.php
real    0m3.826s
user    0m3.817s
sys     0m0.006s

$ time php test_base.php
real    0m2.217s
user    0m2.210s
sys     0m0.006s

if文の判定にかかる時間は「==」の場合で2.5秒、「===」の場合で1.6秒となり、3割は早くなりました。

また、数値文字列同士の比較(「"12"=="12"」と「"12"==="12"」)では3.6秒と1.6秒と、差がかなり大きくなりました。数値文字列同士の比較では数値への変換が行われ、そこで速度の低下が起きてしまいます。

ただし、「===」を使う場合には注意する点もあります。たとえば、POSTやGETのデータは文字列となってしまうので、その値と数値を「===」で比較する場合は、POSTやGETの変数を数値にキャストする必要があります。

文字列同士の比較であれば、「===」の方が高速なので使うようにしましょう。ただし、数値比較に関しては、数値文字列が混入すると問題になるのであれば、「==」を使用した方が無難かもしれません。

バックナンバーについて

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

Tipsꗗy[W 

Pick Up Q&A

Q
動的なURLを静的に見せる方法
 このエントリーをはてなブックマークに追加 
A
普通に考えて、mod_rewrite でしょうね。 http://www.nishishi.com/blog/2006/01/mod_rewrite_url.html...

>>続きを読む

GETのままでは検索エンジンのロボットが拾ってくれなかったためにSEO対策として有効だと言われていますね。

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