PHPで三項演算子のネストがおかしい
三項演算子のネストには賛否両論あるけど、時にはこういう風に書きたいこともあるわけで。
<?php $value = 'hoge'; $result = $value == 'hoge' ? 10 : $value == 'fuga' ? 20 : -1; print $result; ?>
20
期待する出力は10なんだけど、なぜか20になる。
そこでこんな風にしてみたら……
<?php $value = 'hoge'; $result = $value == 'hoge' ? hoge() : $value == 'fuga' ? fuga() : -1; print $result; function hoge() { print 'hoge'; return 10; } function fuga() { print 'fuga'; return 20; } ?>
hogefuga20
( Д ) ゚ ゚
貫通しとるがな!
<?php $value = 'hoge'; $result = $value == 'hoge' ? hoge() : ($value == 'fuga' ? fuga() : -1); print $result; function hoge() { print 'hoge'; return 10; } function fuga() { print 'fuga'; return 20; } ?>
hoge10
elseに相当する部分を括弧で括ってみたら期待通りになった。
いやだがしかし、括弧で括るぐらいならifやswitchで書くっつーの。
他の言語
my $value = 'hoge'; my $result = $value eq 'hoge' ? 10 : $value eq 'fuga' ? 20 : -1; print $result;
10
public class Ternary { public static void main(String[] args) { String value = "hoge"; int result = value == "hoge" ? 10 : value == "fuga" ? 20 : -1; System.out.println(result); } }
10
var value = 'hoge'; var result = value == 'hoge' ? 10 : value == 'fuga' ? 20 : -1; alert(result);
10
ここらでPHPが異端だということははっきりしたので、他の言語は割愛。