PHP intval() behaviour?


PHP intval() behaviour?

这听起来很奇怪:

$test_1 = 'string';
$test_2 = '0';
var_dump(intval($test_1)); // Output: int 0
var_dump(intval($test_2)); // Output: int 0
$can_cast = intval($test_2) ? 'sure' : 'nope'; // Wrong!!!

因此在stringint的转换中,intval返回0。很好,但它返回0,当字符串实际上可以被强制转换为零时(因为零),因此是有效的。

如何区分两者(允许'0'作为字符串和拒绝'字符串')?

EDIT:好吧,让我说我知道我可以使用is_numericBut is_numeric('2.3')返回true,所以它没有帮助。和:

$test = '0';
var_dump(is_numeric($test) && intval($test)); // Fail!!!

您可以在强制转换之前做ctype_digit检查(如果您只想要正数)。或者,您可以使用filter_varFILTER_VALIDATE_INT进行整数验证。整数验证还将检查整数语义,即它将确保整数在允许的范围内。