好吧我只是偶然发现了一个奇怪的PHP行为,同时尝试
验证用户输入是否是整数。String to int cast in php
当我试着投一个字符串12345A
为int e.g
$int_var = (int)'12345A';
我得到12345
为什么不是PHP抛出一个异常,而是静静地省略了 'A'?
好吧我只是偶然发现了一个奇怪的PHP行为,同时尝试
验证用户输入是否是整数。String to int cast in php
当我试着投一个字符串12345A
为int e.g
$int_var = (int)'12345A';
我得到12345
为什么不是PHP抛出一个异常,而是静静地省略了 'A'?
PHP tries to convert字符串的开始部分为整型:
值给出由字符串的最初部分。如果字符串以有效的数字数据开头,则这将是使用的值。否则,该值将为0(零)。
如果被转换的变量是标量,类型转换功能不应该抛出异常,或者以其他方式失败。如果变量是一个对象,它将触发通知,但是转换将被执行。
如果要检查,如果$t
变量包含一个数值,使用is_numeric
:
if (is_numeric($t)) {
// ...
}
不要使用is_int
,因为如果$t
就像'1234'
一个字符串(通常情况下),那么is_int
将返回false
,因为类型为string
,但不是int
。
另外,还要考虑trim
明$t
在检查前:
$t = trim($t);
,因为用户可以提交类似" 123"
。但是,由于领先的空间,应用程序通常不应该失败。
当你这样做时,PHP会尽力转换为数字,包括剥离非数字字符。
如果你想确定这是一个int,你可以使用is_int()
,如:
$t = '12345A';
if (!is_int($t)) throw new Exception('Not an integer: ' . $t);
这将失败,因为$ t不是一个整数,它是一个字符串。看到接受的答案。 – ChristianF
因为这就是它设计的目的? –
所以我应该通过字符串进行循环,并检查字符是否是数字? –
当你有一个32位的系统时,后者更好,并且你想要一个大于PHP_MAX_INT的int。 – RJParikh