0

我根据数据库中的值测试表单的输入。当涉及到传真和电话号码时,字符串比较失败。

$fax = trim($args['fax']);
$oldFax = trim($address->getFax());
if($fax != $oldFax){
  $address->setFax($fax);
  $address->flagChanged('fax');
}

上面的测试在比较“+494321”和“00494321”时发现了一个匹配项。这是为什么?如果我使用 !== 进行测试,它会按预期工作。

4

5 回答 5

2

因为!==比较值类型!=并将字符串隐式转换为整数。

于 2013-04-23T07:55:18.680 回答
1

给你一个链接:

http://php.net/manual/en/language.operators.comparison.php

如果您比较数字字符串,每个字符串都将转换为省略所有前导零和符号的数字(并且以数字方式执行比较)

于 2013-04-23T07:57:41.950 回答
1

这是因为类型杂耍,这意味着字符串可以用作数字,并且您正在使用“松散等于”比较运算符 ==

如果一个表达式的操作数是一个数字(即包含数字并且可以被认为是一个数字),那么它将在被比较之前被转换为适当的数字类型(integerfloat)。所以,这就是 PHP 实际看到以下表达式的方式:

("+494321" == "00494321") => (494321 == 494321)

第一个操作数去掉了加号(它只是意味着数字是正数),第二个操作数的零被截断了(它们并不真正意味着任何东西;即077它们都是相同的十进制数,只是表示方式略有不同)。

如果你想准确地比较两个字符串,那么有几种方法可以做到这一点。第一种是简单地使用“完全等于”运算符===。使用此运算符,操作数将永远不会被类型杂耍,也就是说比较运算符的两侧将完全匹配;字符串将是字符串,整数将是整数,依此类推。

例如,这两个表达式都等于false

"123" === 123
"006" === 6

另一种方法是使用strcmp函数(或类似的相关函数)。它逐字节比较字符串:

$a = "+494321";
$b = "00494321";
if (strcmp($a, $b) === 0) {
    echo "The same";
} else {
    echo "Not the same";
}

0如果两个字符串之间没有差异(即差异为零),则该函数返回。如果返回的数字小于或大于0则两个字符串不相同。

于 2013-04-23T08:19:19.327 回答
0

因为

=== and !== 

做严格匹配。然而

== and !=

才不是。

于 2013-04-23T07:54:48.243 回答
0

只要有可能,总是做严格的比较。

==!=做一些非常奇怪的事情,例如在你的情况下两者看起来都像数字,所以 PHP 将以数字方式比较字符串(= 尝试将它们转换为整数并进行比较)..

手册中更奇怪的例子:http: //php.net/manual/en/language.operators.comparison.php

于 2013-04-23T07:56:17.323 回答