【问题标题】:Comparing different strings in PHP with == returns true用 == 比较 PHP 中的不同字符串返回 true
【发布时间】:2012-12-24 21:55:34
【问题描述】:

我刚刚调试了一个脚本,发现 if 语句没有按我预期的方式工作。

var_dump("6064365413078728979" == "6064365413078728452");
die();

上面的代码会产生以下结果:

bool(true)

使用 === 运算符,它可以按预期工作。有人知道为什么吗?

我在 x64 windows 机器上使用 PHP 版本 5.3.13 和 wamp 安装。

【问题讨论】:

  • 在我的 php 版本 5.3.10 上,您的代码返回 false。
  • 返回 false。不知道你是怎么做到的。
  • 这是因为非空字符串等价于 true.. 你就像比较 TRUE == TRUE.. === 运算符但是对数据类型很敏感
  • 在我们研究的时候,请您告诉我们PHP_INT_MAX对于您的服务器的价值是多少?
  • int(2147483647) 所以你是对的。谢谢大家的帮助。为了将来的目的,我应该改变你的“正确”答案吗?

标签: php string comparison string-comparison comparison-operators


【解决方案1】:
<?php
$a=6064365413078728979;
$b=6064365413078728452;
echo $a."<br>".$b;
//var_dump( $a==$b );
die();
?>

当您运行它时,在您的机器上可能会超出某个数字的限制,这就是发生数字比较的情况。试试上面的脚本,看看 $a 的值可能与你给的值不同。

这就是为什么当两者在数字上比较时它们是相等的。因此,请按照其他人的建议使用 ===

编辑:根据@Axel 的建议进行解释。

PHP Manual解释

浮点数的大小取决于平台,但最大值为 ~1.8e308,精度约为 14 位十进制数字是常见的 值(64 位 IEEE 格式)。

this website 提供并解释溢出现象和一个小的 php 代码来测试您系统的整数和浮点范围。了解服务器上的限制很可能会最好地解释为什么会出现报价流

【讨论】:

  • @Lubje 看到两者是一样的 :)
  • @HankyPanky,您能否通过一些关于类型杂耍的 PHPdocs 链接来完成您的回答,stirng conversionPHP int and float limits 以制作一个完美的 wiki 问题?这样做后,我将删除我的答案。如果你觉得这样做我会很高兴。
  • 嗯……不准确。我们的发现是最终没有溢出,但是字符串被转换为浮点数并且整数部分被贬值,直到两个数字在它的表示上相等......你认为你可以提高 ti 吗?
【解决方案2】:

PHP 有松散的类型比较行为,所以你的数字字符串在== 非严格比较之前被转换为整数类型,转换结果溢出。

这是尽可能使用=== 的主要原因。

查看this page 了解有关类型杂耍的更多详细信息。

【讨论】:

  • 所以即使它们都是字符串,它们也会被转换?
  • 是的,也许我的知识有限,但 PHP 是我所学的唯一能做到这一点的语言。但答案是肯定的:PHP 会在决定如何转换它们之前查看字符串中的内容。
  • @Gordon,在你的情况下这等于1 == 0,但在这种情况下整数溢出。让我再补充一些关于 PHP 整数限制的信息(这取决于机器,所以会有一些有趣的信息)
  • @Áxel 这不仅仅是关于 int。甚至浮动也有基于架构的限制。所以你的答案仍然成立。在他的情况下,这个限制可能超出了。
  • 是的,基于架构可以超过。虽然我现在不知道确切的最大值,但他可能使用 32 位架构,并且可能会限制在该点以下
猜你喜欢
  • 2012-01-30
  • 2012-04-12
  • 1970-01-01
  • 1970-01-01
  • 2016-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多