php中的双等号和三重等号


Double equals and tripple equals in php

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

在PHP中我们应该总是使用三重相等来进行验证吗?

例如,我有一个变量:
$x = '1';
if($x == 1)  // will work
if($x === 1) // will not

现在,我的观点是如果我们需要验证像

这样的数字字段:

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

由于===也验证类型,如果我们总是使用===会更好吗?

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

==没用。

它不是及物的。"foo" == TRUE, "foo" == 0…当然,= 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

也就是说,当你绝对确定类型不是一个问题,当你创建简单的表达式,==在我的经验足够好。

这完全取决于你正在编写的脚本,这个问题没有一个正确的答案。话虽如此,在很多情况下,您都不知道变量的类型(可能除了用户输入)。

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

==在大多数情况下都很好,如果你不应该使用它,它就不会被发明出来:)

这取决于你想做什么。
考虑到表单中的数据是字符串,==很方便,因为它可以比较,例如,表示数字的字符串与没有额外类型转换的数字。

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

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

if (is_numeric($x) && $x == '1') { ...
在我看来这是多余的。为什么我们需要检查$x is_numeric和值'1' ?我们知道'1'是数字所以如果它等于'1'那么它一定是数字。

你可以使用===比较:

如果你不介意将其解释为字符串:

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

如果必须将值解释为int

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

如果你不关心实际的类型:

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

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

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

如果你期望你传递的变量将(并且必须)是整数,那么你应该使用triple equal,如果不是,那么你应该避免使用

虽然,如果你真的想使用===,那么你应该在这个过程中把变量转换成你想要的类型,就像这个例子:

if ((int) $var === 1)
{
    // will return true if the $var is 1
}

如果您想要如此强的验证,那么答案是:是的,绝对使用===

==还做了一些非常奇怪的事情,比如将完全不同的字符串作为相等进行比较,只是因为它们在数值上相等。所以在大多数情况下,===可能对你来说是一个更好的工具。