好的,我只是偶然发现了PHP中的奇怪行为 验证用户输入是否为整数。
当我尝试将字符串12345A
转换为int例如
$int_var = (int)'12345A';
我得到了12345。
为什么PHP不会抛出异常,而是默默地省略'A'?
答案 0 :(得分:3)
当你做这样的演员表时,PHP会尽力转换为数字,包括剥离非数字字符。
如果你想确定它是一个int,你可以使用struct foo
{
void bar() {
if(this == nullptr) {
sink(__LINE__);
}
if((uintptr_t)this < 0x10) {
sink(__LINE__);
}
if((volatile uintptr_t)this < 0x10) {
sink(__LINE__);
}
}
};
,如:
is_int()
答案 1 :(得分:2)
PHP tries to convert字符串的初始部分为整数类型:
该值由字符串的初始部分给出。如果字符串以有效数字数据开头,则这将是使用的值。否则,该值将为0(零)。
如果正在转换的变量是标量,则类型转换功能不应抛出异常,也不应以任何其他方式失败。如果变量是一个对象,它将触发通知,但仍会执行转换。
如果您想检查,如果$t
变量包含数值,请使用is_numeric
:
if (is_numeric($t)) {
// ...
}
请勿使用is_int
,因为如果$t
是'1234'
之类的字符串(通常就是这种情况),那么is_int
将返回false
,因为类型为string
,但不是int
。
另外,在检查之前考虑trim
ming $t
:
$t = trim($t);
因为用户可能会提交" 123"
之类的内容。但是应用程序通常不应该因为领先的空间而失败。