omoonのブログ

旅の思い出を写真とともに書いてみるか。

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では今後三項演算子の積み重ねは使わないようする!フン!

三項、もとい、参考)