PHP中的双等号和三等号的区别

7

我在StackOverflow和Google上搜索,但找不到这个问题的答案:

在PHP中进行验证时,我们是否应该始终使用三个等号?

例如,我有一个变量:

$x = '1';

if($x == 1)  // will work
if($x === 1) // will not

现在,我的观点是如果我们需要验证数值字段,例如:

if(is_numeric($x) && $x == '1') { 相当于 if($x === 1)

由于 === 也验证类型,那么我们总是使用 === 是否更好?

7个回答

6

来自http://me.veekun.com/blog/2012/04/09/php-a-fractal-of-bad-design/

== 是无用的。

‣ 它不具有传递性。"foo" == TRUE,而 "foo" == 0… 但当然,TRUE != 0。

‣ 当可能时,== 会转换为数字,这意味着它在可能情况下会转换为浮点数。因此,大型十六进制字符串(例如密码哈希)可能会在它们实际上不相等时偶尔比较为真。即使JavaScript也不会这样做。

‣ 出于同样的原因,"6" == " 6","4.2" == "4.20","133" == "0133"。但是请注意,133!= 0133,因为0133是八进制。

‣ === 比较值和类型...除了对象,在对象中,只有当两个操作数实际上是同一个对象时,=== 才为真!对于对象,== 比较每个属性的值和类型,这就是对于其他每种类型 === 所做的事情。什么。

请参见http://habnab.it/php-table.html

http://phpsadness.com/sad/47

以及http://developers.slashdot.org/comments.pl?sid=204433&cid=16703529

话虽如此,当您创建简单表达式时确保类型不是问题时,我在经验中发现 == 工作得足够好。只要保持警惕。


5

这完全取决于你所编写的脚本,没有一个正确的答案。话虽如此,在不考虑用户输入的情况下,很少有不知道变量类型的情况。

这就是为什么我坚持使用 == ,只有在可能有多种类型的变量时才使用 ===

==大多数时候都可以使用,如果不应该使用它,那它就不会被发明出来:)


1
“这完全取决于你所编写的脚本。” +1 - TimWolla
请注意,"1e3" == "1000""61529519452809720693702583126814" == "61529519452809720000000000000000"都为true,因此您不应使用==来比较字符串。 - ausi
1
如果不打算使用它,它就不会被发明出来 - 抱歉,我不相信这个说法。特别是考虑到 PHP 最初的演变方式。 - bravmi
@ausi,我刚试了一下第二个字符串比较,但结果为false。我的电脑上是5.5.21版本的。为什么它们会被认为是相同的呢? - Swaraj
1
@Swaraj PHP 5.4.4中修复了第二个比较Bug #54547。为什么在5.4.4之前它们会被评估为true,可以在这里找到说明:http://phpsadness.com/sad/47 - ausi

3

这取决于你想要做什么。
考虑到表单中,数据是以字符串的形式传输的,==很方便,因为它可以比较表示数字的字符串和实际数字,而不需要进行额外的类型转换。

if ($_GET['amount'] == 10) {
    //...
}

所以,不,总是使用===并不更好。

1
if (is_numeric($x) && $x == '1') { ...

我觉得这看起来有些冗余。为什么我们需要检查$x是否为数字并且值为'1'?我们知道'1'是数字,所以如果它等于'1',那么它必须是一个数字。


你可以使用 === 进行比较:
如果你愿意将其解释为字符串:
if ($x === '1') { ...

或者

如果你必须将该值解释为一个 int

if ((int) $x === 1) { ...

或者

如果您不关心实际类型:

if ($x == '1') { ...

0

我认为最好总是使用===,并在可以证明的情况下删除一个=

是的,它们是相等的,尽管很奇怪。更好的写法是if(is_numeric($x) && $x == 1)


0

如果你期望传递的变量必须是整数,那么你应该使用三个等号。否则,你应该避免这样做。

尽管如此,如果你真的想使用 ===,那么你应该在途中将变量转换为所需的类型,就像这个例子一样:

if ((int) $var === 1)
{

    // will return true if the $var is 1
}

-1
如果你想要这样强的验证,那么答案是:是的,一定要使用=====也会做一些非常奇怪的事情,比如将完全不同的字符串视为相等,只因它们在数值上相等。因此,在大多数情况下,===可能会是更好的工具。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接