[Perl][PHP][JavaScript]三項演算子の違い
何かと嫌われがちな三項演算子です。読みづらい、と言われがちですが、何個も連ねなければそこまで読みづらくもないと思います。
PHPでは計測していないけれど、Perlの三項演算子とif分岐を比較すると動作速度が結構違いますし、複雑にしなければ使ってもいいのかなと思います。
(ifなど、ブロックを作って変数のスコープが発生するような構文は、そうじゃない場合と比較して大抵遅くなります。)
というか、変数に値を代入しようとしていることが分かりやすいので、簡素な条件で使用するのであればif分岐するより読みやすいと思います。
変数に値を代入する以外にも使用できますが、printやechoなどで出力する程度ならまだいいのですが、それ以外は分かりづらいのでやめたほうがいいかと思います。
ただ、PerlやJavaScriptの三項演算子とPHPの三項演算子では式を評価する順が違うので注意が必要です。
使わない理由があるとすれば、「読みづらい」という慣れと書き方の問題よりも、こちらかなと思います。
ネストした三項演算子の結果は下記の通りです。
#perl my $value1 = 1; my $value2 = 'test'; my $result = ( $value1 >= 1 && $value2 eq 'test' ) ? 1 : ( $value2 eq 'test' ) ? 2 : 3; # $result = 1
//JavaScript var $value1 = 1; var $value2 = 'test'; var $result = ( $value1 >= 1 && $value2 == 'test' ) ? 1 : ( $value2 == 'test' ) ? 2 : 3; // $result = 1
//PHP $value1 = 1; $value2 = 'test'; $result = ( $value1 >= 1 && $value2 == 'test' ) ? 1 : ( $value2 == 'test' ) ? 2 : 3; // $result = 2
ということで、PHPは右から評価されます。
単体で使用するなら、if分岐するより読みやすい場合もあると思いますが、PHPの場合はネストして使用するのはやめたほうがいいですね。
PHP以外の言語で使用する際も、改行を入れないとかなり可読性が下がるので、そこは読みやすく書くようにしましょう。
#読みづらい。 my $result = ( $value1 >= 1 && $value2 eq 'test' ) ? 1 : ( $value2 eq 'test' ) ? 2 : 3;