2016-11-24 104 views
-2

好吧我只是偶然发现了一个奇怪的PHP行为,同时尝试
验证用户输入是否是整数。String to int cast in php

当我试着投一个字符串12345A为int e.g

$int_var = (int)'12345A'; 

我得到12345

为什么不是PHP抛出一个异常,而是静静地省略了 'A'?

+3

因为这就是它设计的目的? –

+0

所以我应该通过字符串进行循环,并检查字符是否是数字? –

+0

当你有一个32位的系统时,后者更好,并且你想要一个大于PHP_MAX_INT的int。 – RJParikh

回答

2

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"。但是,由于领先的空间,应用程序通常不应该失败。

3

当你这样做时,PHP会尽力转换为数字,包括剥离非数字字符。

如果你想确定这是一个int,你可以使用is_int(),如:

$t = '12345A'; 
if (!is_int($t)) throw new Exception('Not an integer: ' . $t); 
+0

这将失败,因为$ t不是一个整数,它是一个字符串。看到接受的答案。 – ChristianF