超メモ帳(Web式)@復活

小説書いたり、絵を描いたり、プログラムやったりするブログ。統失プログラマ。


SPONSORED LINK

PHPの三項演算子が駄目な理由。


会社からなんで手短に。

 

今日、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;


PHP code - 7 lines - codepad

 

正解は20です。PHP三項演算子は左結合なのでこの現象が起きます。
つまりこういうことです。

$result = ( ($value == 'hoge' ? 10 : $value == 'fuga') ? 20 : -1);


PHP: 演算子の優先順位 - Manual

 

極めつけ。次のソースで予想される表示は何でしょうか?

<?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 code - 11 lines - codepad

 

突き抜けます。仕様とはいえ非常に気持ち悪いです。

 

とまぁ、こんなこんな感じのトラブルを抱えているPHPですが、長く使っていれば細かいことよりも生産性の高さに気づくでしょう。旨味を上手く利用すればいいのです。プログラミング言語は道具です、癖を掴んで適所適材な言語を選べばいいのです。三項演算子だって適切に使えばソースをシンプルに保てます。

 

要は使っている奴の問題なのです。三項演算子でネストしてたり、常習的にGLOBAL変数を1メソッドで10個も並べている(しかもそのメソッドの中で一度も使われていない)様な使い方をする奴が駄目なのです。今触ってるスパゲッティーコードがまさしくそうなので、そのうちネイルハンマーで眉間をかち割りにいきます。

 

■ 参考サイト様

 

PHPで三項演算子のネストがおかしい - ぱせらんメモ

 

パーフェクトPHP (PERFECT SERIES 3)

パーフェクトPHP (PERFECT SERIES 3)

 
PHP逆引きレシピ 第2版 (PROGRAMMER’S RECiPE)

PHP逆引きレシピ 第2版 (PROGRAMMER’S RECiPE)

 

 

プライバシーポリシー免責事項