perlとphpで三項演算子の挙動が違う件
最高にはまった。そんなの有りか!と叫びたい。
perlでは、
my $p = 1; my $q = 1; my $r = $p ? 'p' : $q ? 'q' : 'foo'; print $r;
とすると、「p」が返ってくるが、
phpでは、
<?php $p = 1; $q = 1; $r = $p ? 'p' : $q ? 'q' : 'foo'; print $r; ?>
なんと、「q」が返る。
このあたりの解説によると、
<?php // ぱっと見た感じでは、これは 'true' と表示されると思うでしょう。 echo (true?'true':false?'t':'f'); // しかし、実際には上の出力結果は 't' です。 // なぜなら、三項演算子は左から右へ順に評価されるからです。 // 上のコードをもう少しわかりやすく書くと、このようになります。 echo ((true ? 'true' : 'false') ? 't' : 'f'); // まず、最初の式が 'true' と評価されます。この 'true' は // (bool)true と評価されるので、それをもとに二番目の三項 // 演算子が評価されます。 ?>
ということらしい。perlは右結合、phpは左結合なんだそうだ。
それにしても、一行目の
ぱっと見た感じでは、これは 'true' と表示されると思うでしょう。
って、どないやねん!そら思うがな。なぞなぞちゃうっちゅうねん!
注意: 三項演算子を "積み重ねて" 使用することは避けましょう。 ひとつの文の中で複数の三項演算子を使用した際の PHP の振る舞いは、 少々わかりにくいものです。
とか、
Example#3 三項演算子のわかりにくい挙動
とおっしゃっていますので、phpでは今後三項演算子の積み重ねは使わないようする!フン!
三項、もとい、参考)