ctype_digit()が期待ハズレだった件

phpは型がとてもゆるい言語です。
普段は3と"3"の違いを殆ど意識する事無くコーディングが出来ます。
外部からHTTP POSTされた"3"と、とあるメソッドがreturnした3を、同じメソッドに渡して処理する事も往々にしてあります。
そんなゆるいコーディングをしていても、stringでもintegerでも構わないけど数だけを扱いたい事は良くあります。
アルファベットや記号やマルチバイトはお断りです。


しかし、空気の読める言語なはずのphpに、それをうまいこと判別してくれるメソッドがどうも見当たりません。
is_int()=is_integer()はinteger型。
is_numeric()はとても良い線いってますが、3.3のような少数もtrueにしてしまいます。
これで充分な時もありますが、整数に限りたい時はやはりあります。


そこで見つけたのがctype_digit()です。
少数はfalseで整数はtrueを返すとても空気の読める関数で、さらにis_integer()よりも速いらしい。
これは使えると思っていたのですが、ctype_digit(3)でfalseという罠*1が・・・


is_numeric()もctype_digit()も、もうちょっとだけ空気読んでくれればいいのにと思います。

is_int(3); //true
is_int('3'); //false
is_numeric(3); //true
is_numeric('3'); //true
is_numeric(3.3); //true
is_numeric('3.3'); //true
ctype_digit('3'); //true
ctype_digit('3.3'); //false
ctype_digit(3); //false

ちなみに、(int)でキャストしたりintval()するのは、情報が落ちちゃうのでちょっと避けたいですね。
細かいこと過ぎて、好みの問題になってるかも知れませんが、気になるものはしかたがないということで。

*1:php5.1以下の場合ctype_digit('')でtrueという謎仕様もありました。5.1からはfalseです。