Смотрите это. Преобразует $ val в целое число, а затем проверяет, является ли исходный $ val, преобразованный в строку, IDENTICAL (===) - просто == не будет работать должным образом - в целочисленное значение val, преобразованное в строку.
function validInt($val, $min=null, $max=null) {
$ival = intval($val);
//echo "'$ival' '$val'<br>\n"; // Uncomment to see the comparisons done in below if block
if(''.$ival !== ''.$val) {
return false;
}
if($min !== null && $ival < $min)
return false;
if($max !== null && $ival > $max)
return false;
return true;
}
Если вы не проверяете строковые значения, они могут работать не так, как вы ожидаете:
$nums = array(
'1',
'+1',
'-1',
'01',
'1.0',
'.0',
'1.123',
'a123',
'0x101010',
1,
-1,
01,
1.0,
.0,
1.123,
0x101010,
);
foreach($nums as $num) {
if(validInt2($num))
echo $num." - Valid integer.<br>\n";
else
echo $num." - Not a valid integer.<br>\n";
}
Выход:
1 - Valid integer.
+1 - Not a valid integer.
-1 - Valid integer.
01 - Not a valid integer.
1.0 - Not a valid integer.
.0 - Not a valid integer.
1.123 - Not a valid integer.
a123 - Not a valid integer.
0x101010 - Not a valid integer.
1 - Valid integer.
-1 - Valid integer.
1 - Valid integer.
1 - Valid integer.
0 - Valid integer.
1.123 - Not a valid integer.
1052688 - Valid integer.
Причина в том, что даже если вы используете шестнадцатеричное (0x101010), восьмеричное (01) или целое число, хранящееся как float (1.0, 0.0), внутренне все они хранятся как float. Однако если вы используете функцию для проверки на наличие int, хранящегося в виде строки, она будет работать.