会社からなんで手短に。
今日、PHPの入門記事が炎上しているのを見たんですよね。あれは叩かれても仕方ない内容だったとはいえ、アウトプットした初心者を注意するにはやり過ぎな気がしました。中にはプログラミング界の有名人の方も居ましたし。なんとなく、直接指摘するには忍びないけど、PHPの三項演算子とかグローバル変数の仕様は嫌いなので調べたので書いておく。
PHPは三項演算子とか参照渡しがダメダメだというのは昔っから言われていることです。三項演算子に限ってのバッドノウハウを置いときます。
序の口。
<?php true ? print 'hoge' : print 'piyo';
これは通る。
<?php true ? echo 'hoge' : echo 'piyo';
これは通らない。
PHP code - 3 lines - codepad
PHP code - 3 lines - codepad
三項演算子はif文と等価ではありません。返り値を持たない言語構造を書くとエラーが発生します。
http://jp1.php.net/manual/ja/function.echo.php
次のソースで出力する数はなんでしょう?
<?php $value = 'hoge'; $result = $value == 'hoge' ? 10 : $value == 'fuga' ? 20 : -1; print $result;
正解は20です。PHPの三項演算子は左結合なのでこの現象が起きます。
つまりこういうことです。
$result = ( ($value == 'hoge' ? 10 : $value == 'fuga') ? 20 : -1);
極めつけ。次のソースで予想される表示は何でしょうか?
<?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ですが、長く使っていれば細かいことよりも生産性の高さに気づくでしょう。旨味を上手く利用すればいいのです。プログラミング言語は道具です、癖を掴んで適所適材な言語を選べばいいのです。三項演算子だって適切に使えばソースをシンプルに保てます。
要は使っている奴の問題なのです。三項演算子でネストしてたり、常習的にGLOBAL変数を1メソッドで10個も並べている(しかもそのメソッドの中で一度も使われていない)様な使い方をする奴が駄目なのです。今触ってるスパゲッティーコードがまさしくそうなので、そのうちネイルハンマーで眉間をかち割りにいきます。
■ 参考サイト様

- 作者: 小川雄大,柄沢聡太郎,橋口誠
- 出版社/メーカー: 技術評論社
- 発売日: 2010/11/12
- メディア: 大型本
- 購入: 32人 クリック: 1,065回
- この商品を含むブログ (59件) を見る

PHP逆引きレシピ 第2版 (PROGRAMMER’S RECiPE)
- 作者: 鈴木憲治,山田直明,山本義之,浅野仁,櫻井雄大,安藤建一
- 出版社/メーカー: 翔泳社
- 発売日: 2013/10/22
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (9件) を見る