あまり知られていないと思われるPHPの三項演算子の挙動


最近分岐を書く時に、できるだけ三項演算子で書く様にしています。
理由は、プロっぽく見えてご満悦できるからです。

「if文より処理が早い」http://blog.katsuma.tv/2007/12/javascript_arg_check_2.htmlとか、

「そんな事ない」肉少なめ PHPのチューニングネタ 和訳的なメモ
とか諸説言われてますが、ひとまず「早い」という結果が多い気がするので。

ていうか、関数より式の方が当たり前に早い気はしてます。


そんな三項演算子で、あまり知られてなさそうな挙動があるので備忘録。

if文の代わりにガシガシ使ってると、たまにエラーが出ます。

例えば、

<?php

$hoge = "test";
true ? unset($hoge) : NULL;

これ実行すると、

Parse error: syntax error, unexpected T_UNSET ...

怒られます。

マニュアル確認

PHP: 比較演算子 - Manual

注意: 三項演算子は式であり、値としては評価されずに式の結果として評価されることに注意してください。演算結果をリファレンスとして返したい場合に、これを知っておくことが大切です。結果をリファレンスとして返す関数で return $var == 42 ? $a : $b; とすることはできず、新しいバージョンの PHP では警告を発生します。

うーん?今イチピンとこないですが、とりあえず今のところ三項演算子内で実行してエラー吐かれるのを確認したのは以下です。

unset()
echo
break
return

追って調査したい。

追記

考えてみると上に挙げたものは式じゃないのでエラーになるようだ。
returnとechoは、関数ではなく言語構造とマニュアルに明記してあるし、unset()は返り値がvoidだった。


あと、if文の中に三項演算子式をねじ込んで悦に入ってたりもしてます。

<?php

if (is_array($hoge) ? array_key_exists('fuga', $hoge) : false) {
    .......
}

$hogeが配列かどうか比較して、配列だったら'fuga'がキーにあるかどうか比較してます。

配列でない、もしくは配列で'fuga'がキーに無ければfalse。'fuga'がキーにあればtrueが返ります。

これはまだ見やすいですが、三項演算子をネストすると見づらいですね。でもやる。