文字型(ctype)関数の空文字の扱い

作業中にはまりかけたのでメモ。


事の発端ははるか前に作ったものの修正を行い、
確認時に修正箇所とは全然関係ない郵便番号チェックをしている部分が
文字種エラーになる環境とならない環境がある状態に。

エラー判定している箇所をみると未入力の時のctype_digit()の挙動が違っている感じ。


ということで両方の環境で以下のソースで確認。

echo "<pre>";
var_dump(ctype_alnum(''));
var_dump(ctype_alpha(''));
var_dump(ctype_cntrl(''));
var_dump(ctype_digit(''));
var_dump(ctype_graph(''));
var_dump(ctype_lower(''));
var_dump(ctype_print(''));
var_dump(ctype_punct(''));
var_dump(ctype_space(''));
var_dump(ctype_upper(''));
var_dump(ctype_xdigit(''));
echo "</pre>";

見事にtrueの山とfalseの山に分かれた2つの環境、、(ノ∀`)タハー

マニュアルを見てみると日本語マニュアルには特にそのような表記なし。
続いて英語マニュアル(PHP: Ctype Functions - Manual)を見てみるとなにやら怪しい記述が

When called with an empty string the result will always be TRUE in PHP < 5.1 and FALSE since 5.1.

4系、5系のソースまで追ってないから想像でしかないけれど
5系が5.0→5.1になった時に挙動が変わったということはその時の
4系(4.3→4.4)も影響を受けたっぽい。


trueになる環境が4.3.11、falseになる環境が4.4.2だったので多分間違いないかと。
それにしても今回は気づいたからいいものの
メジャーバージョンアップでもないのに挙動を変えないでほしい、、と思うのは私だけ?
他にも知らないこういう変更がありそうでちょっと怖い、、


あと、こう見ると英語マニュアルを常に見ないとダメなのかな、、今の状態だと
翻訳を手伝うのが一番いいんだけど時間が、、・゚・(ノД`)・゚・