Php 如果在比较整数和字符串时返回错误的结果

Php 如果在比较整数和字符串时返回错误的结果,php,if-statement,Php,If Statement,不确定我是否没有看到什么东西,但我有一个简单的id验证 $id = '2s2'; var_dump($id); var_dump($id*1); if ($id != ($id*1) || $id <= 0) { die('wrong id'); } die('here?'); 它检查id是否与id乘以1相同,或者如果值为零或更低,则检查。因为,$id='2s2它不一样(可以在转储中看到) 为什么这不回显错误的id?我猜您可以将它乘以1,看看$id是否是数字。在这种情况下,您可

不确定我是否没有看到什么东西,但我有一个简单的
id
验证

$id = '2s2';

var_dump($id);
var_dump($id*1);
if ($id != ($id*1) || $id <= 0) {
    die('wrong id');
}
die('here?');
它检查
id
是否与
id乘以1相同,或者如果值为零或更低,则检查
。因为,
$id='2s2它不一样(可以在转储中看到)


为什么这不回显
错误的id

我猜您可以将它乘以1,看看
$id
是否是数字。在这种情况下,您可以简单地:

if (!is_numeric($id) || $id <= 0) {
    die('wrong id');
}

如果(!is_numeric($id)|$id我猜你将它乘以1,看看
$id
是否是数字。在这种情况下,你可以简单地:

if (!is_numeric($id) || $id <= 0) {
    die('wrong id');
}

如果(!is_numeric($id)| |$id当您比较两个不同类型的变量(并执行一些其他操作)时,PHP会执行一个名为的操作。基本上,它会在对两个操作数进行操作之前尝试将它们转换为相同的类型

在这种情况下,PHP会反直觉地将两个操作数都转换为整数。的规则基本上是“从字符串的开头提取字符,直到找到非数字,然后丢弃其余的字符”

因此,左边的
$id
实际上是
“2s2”
,从非整数部分剥离为
“2”
,然后与右边的操作数进行比较。右边的操作数
($id*1)
基本上经过相同的过程-在数学上下文中,PHP被迫将字符串视为整数

如果($id!==($id*1))
,您可以使用严格的比较运算符
——这样您就可以告诉PHP您不希望涉及类型转换,结果将如您所期望的那样


还有一种更简单的方法可以测试
$id
是否为整数:当您比较两个不同类型的变量(并执行一些其他操作)时,PHP会执行一个名为的操作。基本上,它会在对两个操作数进行操作之前,尝试将两个操作数转换为相同的类型

在这种情况下,PHP会反直觉地将两个操作数都转换为整数。的规则基本上是“从字符串的开头提取字符,直到找到非数字,然后丢弃其余的字符”

因此,左边的
$id
实际上是
“2s2”
,从非整数部分剥离为
“2”
,然后与右边的操作数进行比较。右边的操作数
($id*1)
基本上经过相同的过程-在数学上下文中,PHP被迫将字符串视为整数

如果($id!==($id*1))
,您可以使用严格的比较运算符
——这样您就可以告诉PHP您不希望涉及类型转换,结果将如您所期望的那样


还有一种更简单的方法来测试
$id
是否为整数:

为什么要将字符串相乘?顺便说一句,一切乘以1就是它本身,不是吗?@PhiterFernandes哦,好吧,听起来很脏:)如果目的是将其转换为整数,那么使用
(int)不是更明智吗
或其他指定方法?而不是将其与1相乘:如果将数字与字符串进行比较,或比较涉及数字字符串,则每个字符串将转换为一个数字并执行比较numerically@Albzi不,这将永远不会匹配,因为您将比较字符串和整数,并且
2!='2'
。为什么要将字符串相乘?顺便说一句,一切都乘以1,不是吗?@PhiterFernandes哦,好吧,听起来很脏:)如果目的是将其转换为整数,那么使用
(int)
或其他指定方法不是更聪明吗?而不是将其与1相乘:如果将数字与字符串进行比较,或者比较涉及数字字符串,则将每个字符串转换为数字并执行比较numerically@Albzi不,这将永远不会匹配,因为您将比较字符串和整数,并且
2!='2'
。嘎不敢相信我犯了那个错误!对我来说绝对是休息日。嘎不敢相信我犯了那个错误!对我来说绝对是休息日。