当前位置:  开发笔记 > 编程语言 > 正文

将String与Integer进行比较会产生奇怪的结果

如何解决《将String与Integer进行比较会产生奇怪的结果》经验,为你挑选了3个好方法。

我真的很困惑为什么这个操作有效.有人可以解释一下吗?

$test1 = "d85d1d81b25614a3504a3d5601a9cb2e";
$test2 = "3581169b064f71be1630b321d3ca318f";

if ($test1 == 0)
  echo "Test 1 is Equal!?";
if ($test2 == 0)
  echo "Test 2 is Equal!?";

// Returns: Test 1 is Equal!?

为了澄清,我试图将字符串"0"$test变量进行比较.我已经知道修复代码我可以附上(因为我应该有)的0""小号

我想知道这是一个PHP错误,服务器错误,还是某种有效的操作.根据http://us3.php.net/types.comparisons,这应该没有用.

编辑: Scratch,显然它确实提到字符串和0之间的松散比较是真的.但我还是不知道为什么.

编辑2:我修改了我的问题,为什么$test2价值"3581169b064f71be1630b321d3ca318f"不起作用?



1> Assaf Lavie..:

从PHP手册:

字符串转换为数字

在数值上下文中计算字符串时,结果值和类型将按如下方式确定.

如果字符串包含任何字符'.','e'或'E',则将其评估为float.否则,它将被评估为整数.

该值由字符串的初始部分给出.如果字符串以有效数字数据开头,则这将是使用的值.否则,该值将为0(零).有效数字数据是可选符号,后跟一个或多个数字(可选地包含小数点),后跟可选指数.指数是'e'或'E',后跟一个或多个数字.


PHP没有像Javascript(另一种松散类型的语言)那样的"NaN"类型,所以它几乎必须转换为0,因为没有其他方法(转换为NULL不起作用,cos NULL也转换为0).我认为答案不是使用松散的比较(==),或者首先验证字符串.

2> thomasrutter..:

使用==运算符键入转换

==运算符是一种松散类型的比较.它会将两者转换为常见类型并进行比较.这里解释了字符串转换为整数的方式.

请注意,您链接的页面与此不矛盾.检查第二个表,它表示将整数0与使用的字符串"php"进行比较==应为true.

会发生什么是字符串转换为整数,非数字字符串(不包含或以数字开头的字符串)转换为0.

数字与非数字字符串

由数字组成的字符串或以数字开头的字符串被视为数字字符串.如果字符串在该数字后面有其他字符,则忽略这些字符.

如果一个字符串以一个不能被解释为数字一部分的字符开头,那么它是一个非数字字符串并将转换为0.这并不意味着数字字符串必须以数字(0-9)开头 - 例如"-1"是数字字符串,因为在这种情况下减号是数字的一部分.

因此,例如,您的字符串"d85d1d81b25614a3504a3d5601a9cb2e"不以数字开头,因此它将转换为0.但是你的第二个字符串"3581169b064f71be1630b321d3ca318f"将转换为整数3581169.这就是为什么你的第二次测试不能以同样的方式工作的原因.

你应该做什么

你可能想要:

if ($test1 === "0")

注意使用三等于而不是双等于.这可以确保您比较的是仅包含数字零的字符串,并防止任何类型转换.



3> St. John Joh..:

经过一番调查后,结果发现,PHP手册中提到的任何一个不以数字开头的字符串在转换为整数时都会被转换为0.

这意味着:

("php" == 0) === true
("1php" == 0) === false

很烦人,没有很好的记录.它位于类型比较页面上的注释的底部.

推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有