php中的双等于和三等于

时间:2011-12-17 19:49:19

标签: 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)

由于===也会验证类型,如果我们始终使用===会不会更好?

7 个答案:

答案 0 :(得分:6)

来自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

话虽这么说,当你完全确定在创建简单表达式时类型不是问题,==在我的经验中运作良好。请保持警惕。

答案 1 :(得分:5)

这完全取决于你写的剧本,对此没有一个正确的答案。话虽如此,您并不知道变量的类型(可能除了用户输入之外)的情况并不多。

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

==大部分时间都很好,如果你不应该使用它就不会被发明:)

答案 2 :(得分:3)

这取决于你想做什么 鉴于来自表单,数据以字符串形式出现,==很方便,因为它可以比较,例如,表示数字的字符串与没有其他类型转换的数字。

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

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

答案 3 :(得分:1)

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

对我来说这看起来多余。为什么我们需要检查$x is_numeric和值'1'?我们知道'1'是数字,所以如果它等于'1'那么它必须是数字。


您可以使用===比较:

如果您将它解释为字符串就可以了:

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

如果您必须将该值解释为int

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

如果您不关心实际类型:

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

答案 4 :(得分:0)

我认为最好始终使用===并删除一个=,以防你认为合理。

是的,它是平等的,虽然很奇怪。更好的写作方式是if(is_numeric($x) && $x == 1)

答案 5 :(得分:0)

如果你期望你传递的变量将(并且必须)是整数,那么你应该使用三倍相等,如果不是,你应该避免这种情况。

虽然,如果你真的想要使用===,那么你应该将变量转换为你想要的类型,就像这个例子一样:

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

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

答案 6 :(得分:-1)

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

==也会做一些非常奇怪的事情,例如将完全不同的字符串比较为相等,只是因为它们在数值上是等价的。因此,===在大多数情况下可能会成为更好的工具。