[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;

© 2018- Saruzie.