[ PHP ] 比較演算子でリテラル値はどっちのオペランドに記述する?右か?左か?

Pocket

ここでは、PHP で比較演算子を使用する例を掲載しています。また、PHP に限った話でもありませんが比較演算子で固定値(リテラル)はどちらのオペランドに記述したほうが良いかご意見いただけると幸いです。

スポンサーリンク

PHP 比較演算子( == === != !== )

PHP で文字列や数値を比較するには、C言語と同様に == と != を使用します。 しかし、PHP では暗黙の型変換(この場合は文字列を数値に変換)が行われたあとに、両者が比較されるため文字列と数値を比較しても一致すると判断されます。

$comp1 =  1;  // 数値
$comp2 = "1"; // 文字列

// 暗黙の型変換後比較する
echo ($comp1 == $comp2)  ? 'true' : 'false'; // true
echo ($comp1 != $comp2)  ? 'true' : 'false'; // false

上記のような暗黙の型変換を行わずに、型の不一致も比較対象とするには、=== および !== 演算子を使用します。はじめて知った時は「お!」って感じだった記憶があります。

$comp1 =  1;  // 数値
$comp2 = "1"; // 文字列

// 型の違いも比較する
echo ($comp1 === $comp2) ? 'true' : 'false'; // false
echo ($comp1 !== $comp2) ? 'true' : 'false'; // true

なお、暗黙の型変換を利用した比較時の注意点として、「数値に変換できない文字列は 0 に変換される」ということがあります。発見に多大なカロリーを消費するバグを生み出す可能性があります。それも、カロリーは消費するが痩せないという謎まで残すおまけ付きです。

$comp1 =  0;
$comp2 = "abcdefgh";

echo ($comp1 == $comp2)  ? 'true' : 'false'; // true
echo ($comp1 != $comp2)  ? 'true' : 'false'; // false

固定値はどっちのオペランドに記述するべきか?

次はわたしの大好きな宗教(?)論争です。不毛な争いが好きなのです。Win – Win ならぬ Lose – Lose で決着する話題が大好きです。

ここでは、「比較演算子を使用する場合に、(true、null、2)といった固定の値を第1オペランドと第2オペランドのどちらに記述すべきか?」という話を取り上げてみたいと思います。PHP に限った話でもありませんが。

第1オペランドに記述する場合

if(true === $value) {
    // 何か処理
}

if(1 === $value) {
    // 何か処理
}

if(null === $value) {
    // 何か処理
}

第2オペランドに記述する場合

if($value === true) {
    // 何か処理
}

if($value === 1) {
    // 何か処理
}

if($value === null) {
    // 何か処理
}

Zend Framework では

古い情報ですが、2011年 7月の段階ではコーディング規約にも特に言及されてなく、コードでも第1オペランドであったり、第2オペランドであったりとまちまちでした。

ただし、文字列の場合は第2オペランドに記述されているようでした。前後の流れの中でもっとも視やすいと感じた方法で記述されているのかもしれません。

あなたはどう考えますか?

あなたはどちらであるべきと考えますか?よろしければ教えてください。ちなみに管理人は、「どちらでも良い」に1票です。見やすさ重視です。これも個人で違いあるとは思いますが。

「どうあるべきか?どちらが正しいか?」と言うよりは、「どちらが好きか?嫌いか?」と言った話のようにも思っています。

参考
スポンサーリンク


Pocket

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>