我根据数据库中的值测试表单的输入。对于传真和电话号码,字符串比较失败。
$fax = trim($args['fax']);
$oldFax = trim($address->getFax());
if($fax != $oldFax){
$address->setFax($fax);
$address->flagChanged('fax');
}
上述测试在比较“+494321”和“00494321”时找到匹配项。这是为什么?如果我测试使用!==而不是按预期工作。
答案 0 :(得分:2)
由于!==
比较值和,因此!=
会隐式将字符串转换为整数。
答案 1 :(得分:1)
让我给你一个链接:
http://php.net/manual/en/language.operators.comparison.php
如果您比较数字字符串,则每个字符串都会转换为数字,省略所有前导零和符号(并以数字方式执行比较)。
答案 2 :(得分:1)
这是因为type juggling,这意味着strings can be used as numbers,而你正在使用"松散地等于" comparison operator ==
。
如果表达式的操作数是数字(即包含数字并且可以被认为是数字),那么它将被转换为适当的数字类型(在比较之前integer
或float
)。所以,这就是PHP实际看到以下表达式的方式:
("+494321" == "00494321") => (494321 == 494321)
第一个操作数删除了加号(它只是表示数字是正数),第二个操作数的零被截断(它们实际上并不意味着什么;即07
和7
都是相同的十进制数,只是略有不同)。
如果你想比较两个字符串完全,那么有几种方法可以做到。首先是简单地使用"完全等于"运营商===
。使用此运算符,操作数永远不会被类型变换,也就是说比较运算符的两侧将完全匹配;字符串将是字符串,整数将是整数,等等。
例如,这两个表达式都等于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
,则两个字符串不相同。
答案 3 :(得分:0)
因为
=== and !==
做严格匹配。而
== and !=
没有。
答案 4 :(得分:0)
尽可能始终进行严格的比较。
==
和!=
做了非常奇怪的事情,例如在你的情况下,两者看起来都像数字,所以PHP将以数字方式比较字符串(=尝试将它们转换为整数并进行比较)。
手册中有更多奇怪的例子:http://php.net/manual/en/language.operators.comparison.php