2012年12月8日土曜日

PHPerのみんなに知ってもらいたい、PHPの重要なこと

このエントリーはPHP Advent Calendar 2012の8日目です。
昨日の7日目ははじかみさんの

Integerの上限を超えてゆけ

でした。
動的型付けの言語はintの限界値とかキャストとか知ってるのと知らないのでは大違いなので大変勉強になりました。

さて私ですが昨日のPostgreSQL Advent Calendar 2012に続いて更新です←ステマ
今日は今年一年で私や私の周囲でPHPにイラッとしたこと ハマったことをまとめておきたいと思います。
もし似たようなことに遭遇した時に「あれ?」って思った時の参考になれば幸いです。


1 5.2以上なのにjson_encodeが動かない
よーしおじさん、JSONしちゃうぞー→Fatal error: Call to undefined function json_encode() in ....
えっ?PHPのバージョンは5.3.10なんだけど?
(json_encode()はPHP5.2以上では標準関数になっています)
php_info()で確認するとenabled。
ググっても全然日本語情報出てこねー!と絶望しました。
こんなときは本家です。
で翻訳こんにゃくを使って英語のバグレポートを見てみるとphpをコンパイルしてinstallしてる場合にjson_encode()がdisableされることがあるらしいとのことでした。
コンパイルし直すかyamやaptでinstallすれば防げるようです。
また5.2未満の対応のようにJSON.phpを使って同名関数を作ってやることでも対応出来ます。
この件で英語の文書を読むことの大切を学びました。

2 XAMPPにEC-CUBEをinstallしようとしたらコケる
エラーメッセージは

Warning: Unknown: function 'NULL' not found or invalid function name in Unknown on line 0

が出ます。
ちょっとローカルで開発したいだけって時にWindowsの強い味方のXAMPP。
以下のようにするとインストール出来ます。

html/.htaccessを修正する。
php_value output_handler NULL

# php_value output_handler NULL

今年はEC-CUBEで色んな辛い思い出経験が出来ました。

3 PHPの変数関連
5.3のphpで下記のcodeはどのように実行されるでしょうか?

$string = 'test';
var_dump($string['hoge']);

この出力結果はなんだと思いますか?
答えは

string(1) "t"

です。
hogeをキャストして$string['0']扱いになってるんですね。
ではプログラムがこのようば場合はどうでしょう?

$row = get_shop();

var_dump($row['id']);

一見shopデータの一覧を取ってきて、連想配列のIDを出力しそうですね。
でも中身が連想配列じゃなくてただのStringで10だった場合は先頭の1を出力します。
例えばこれがINTの10だったらNULLを返します。
言語仕様としては知ってても他人のソースのメンテナンスだったりするとパッと見で判断してハマるので要注意ですね。
しかもこのソースの場合は先頭の文字を返すので実行してもerrorが発生せず、問題はマスターのshopデータが二桁になった時に発生します。
この辺はまた5.4になると変わってくるので新しい技術を覚えると同時に過去のソースのメンテナンスのためにも過去のPHPの挙動を忘れないようにしなければなりませんね。

ということでまだまだ書きたいのも山々ですが今日が終わってしまいそうなのでこの辺で。
これでアドベントカレンダーも約3分の1が終了です。
ということで明日は得上 竜一さんです。
PHPの好きなところとのことですのでPHPの楽しい話が聞けるかもしれませんね!