PHPで数値のValidate - /halt/Snapshotにて
「普通のぺちぱーはis_numericを使います」とあったのでエントリー
(2008-02-10 - kengpong)のエントリーについて
is_numericは小数もtrueなんでそんな普通のぺちぱーはバグを作り込むだけなような・・・
id:kengpongさんの考え方はPHPやってると忘れがちなんですが好きです。
でもコメントアウトしてるctype_digitは「ctype_digitの仕様にハマる。」にもありますが、個人的にも以前""がtrue/falseとバージョンによって戻り値が違って差異を吸収するラッパー関数作ったこともあるんで最近は使ってないですね。
ソースから話の流れを追ってみると、
function isInt1
($value) { #正規表現のみ
return !!
preg_match('/^-?[0-9]+$/',
$value);
} だとtrueがtrueになっちゃうんで
function isInt2
($value) { #正規表現+is関数
if(is_integer($value) ||
is_float($value) ||
is_string($value)) {
return !!
preg_match('/^-?[0-9]+$/',
$value);
#または return ctype_digit((string)$value); ※後述
}
return false;
} にしようってことで、
function isInt3
($value) { #・・・というかis_numeric
return is_numeric($value);
} だとそもそもisIntじゃないってことでしょうか。
表にしてみると
| isInt($value) |
正規表現 |
正規表現+is関数 |
is_numeric |
| 1 |
bool(true) |
bool(true) |
bool(true) |
| 1.1 |
bool(false) |
bool(false) |
bool(true) |
| '1' |
bool(true) |
bool(true) |
bool(true) |
| '1.1' |
bool(false) |
bool(false) |
bool(true) |
| (float)1 |
bool(true) |
bool(true) |
bool(true) |
| true |
bool(true) |
bool(false) |
bool(false) |
| false |
bool(false) |
bool(false) |
bool(false) |
ってとこですかね。
PHPプログラマとしての能力はPHPの関数をどれだけ知っているかで決まる。
はおっしゃる通りですよね。私もPHPを使い出して4年近く(趣味・バイト併せて)なりますがまだまだ新しい発見があります。日々修行ですね。。
あと、「!!preg_match」でbool値にして返す手法も今日知りましたw
確認用:
function isInt1
($value) { #正規表現のみ
return !!
preg_match('/^-?[0-9]+$/',
$value);
}
function isInt2
($value) { #正規表現+is関数
if(is_integer($value) ||
is_float($value) ||
is_string($value)) {
return !!
preg_match('/^-?[0-9]+$/',
$value);
#または return ctype_digit((string)$value);
}
return false;
}
function isInt3
($value) { #・・・というかis_numeric
return is_integer($value);
}
function isInt
($value) {
return isInt1
($value);
#2,3に変更して確認下さい
}
var_dump(isInt
(1));
var_dump(isInt
(1.1));
var_dump(isInt
('1'));
var_dump(isInt
('1.1'));
var_dump(isInt
((float
)1));
var_dump(isInt
(true));
var_dump(isInt
(false));