2009年10月22日木曜日

phpで三項演算子の注意点

どうも、俺@始業です。
別に暇なわけじゃないですよ。

今日はphpで三項演算子を利用した際の注意点をメモります。
三項演算子は例えば
<?php
$a = 1;
// 三項演算子
echo $a == 1 ? "$aは1です。" : "$aは1ではありません。";
と書くと、出力は
$aは1です。
となります。
書き方は
(式) ? 真の場合 : 偽の場合
です。
三項演算子は短く条件分岐を書くことができるので、phpでプログラムを書いた際のView側などで利用できます。

で、
三項演算子を入れ子(ネスト)にした場合、php三項演算子ならではの注意点があります。
<?php
$a = 1;
// 三項演算子
echo $a == 1 ? "$aは1です。" : $a == 2 ? "$aは2です。" : "$aは1でも2でもありません。";
とすると、プログラマーは
$aは1です。
と出力されると予想します。
ところがドッコイこの結果は
$aは2です。
と出力されてしまいます。危ないですねー。
理由はPHPマニュアル@三項演算子にあるように、phpの三項演算子は左から右へ評価の順が移っていくので、上の例でいくと
1)$a == 1 が評価されtrue
2)"$aは1です。"をechoしようとする
3)(1)で評価されたtrueが次の $a == 2で評価されtrue
4)"$aは2です。"をechoする。
という流れになるみたいです。たぶん、、。

要は(3)で$a == 2 が評価されるときに(1)で評価された結果(true)を持ち越してしまうみたいです。

というわけで、どうしても三項演算子を利用して入れ子をしたい場合は
<?php
echo $a == 1 ? "$aは1です。" : ($a == 2 ? "$aは2です。" : "$aは1でも2でもありません。");
と書きましょう。


以上ーー。

0 件のコメント: