所有PHP相等比较都是对称的吗?

时间:2011-01-20 21:06:45

标签: php comparison equals-operator

$a == $b是否始终等同于$b == $a

我认为在JavaScript中有一些奇怪的情况,由于投射,这不是真的。

我认为ide是正确的。我会问另一个question

5 个答案:

答案 0 :(得分:4)

简而言之,是的。 $a == $b始终相当于$b == $a。有一些缺点,如花车。当然,你不应该为了平等而嵌套两个浮点数。

修改
关于浮标:如果你有两个浮动并比较它们,它们在技术上应该是相同的。但是,似乎具有相同值的浮点值实际上不需要相同。因此,如果$a是文字.69$b是计算的结果,则它们可以很好地不同,但两者都显示相同的值。这就是您不应该使用==来比较浮点值的原因。

如果您需要比较浮点值,您确实需要在特定情况下使用最小的可接受差异。这样的东西可用于比较浮点数(在0.000001设置我们最小的可接受差异):

if(abs($a-$b) < 0.000001) {
  //Same
}

PHP: abs - Absolute Value

答案 1 :(得分:3)

我能看到的唯一不同的类型是:

$foo = 1;
$bar = 1;

($foo = $foo + $bar) == ($bar = $foo);

要了解原因,请查看

A -> ($foo = $foo + $bar)
B -> ($bar = $foo);

如果先运行A,则结果为2B的结果为2,因此它们相等,测试结果为true

如果先运行B,则结果为1B的结果为2,因此它们不相等且测试结果为{{1} }。

但是对于任何单一类型的比较(其中false是变量而不是表达式),它总是反身的。

因此,从一般意义上讲,A并非始终100%保证等同于A == B。对于变量,它总是等价的。但对于涉及赋值或修改变量的复杂表达式,它可能不是。

答案 2 :(得分:2)

取决于这两个电话之间发生的事情。否则是的,那些都是一样的。订单没有区别。使用2等于==字符串1和整数1将在比较时返回true。忽略类型,仅比较值。所以没有什么可恶的。

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

<?

$a=(string) 1;
$b=(int) 1;

var_dump($a);
var_dump($b);


echo $a==$b;

输出:1

http://www.ideone.com/JLJWQ

修改

为了澄清一点,在$ a或$ b中绝对没有任何内容可以在比较中获得不同的输出,只需将其放在运算符的另一侧即可。

$a="1234";
$b="1234";

echo $a==$b;
echo $b==$a;

对于任何$ a或$ b值的输出,总是毫无疑问是真的,或者是假的。

答案 3 :(得分:2)

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

如果您想在比较中考虑类型转换,可以使用不同的运算符。 ==在等值时评估为true,但不比较数据类型。当值相等时,===的计算结果为true,数据类型也是如此。使用后者考虑通常会忽略的类型转换(例如:表示整数的字符串和要比较的整数。)

条件中逻辑的顺序不应该有所不同。

答案 4 :(得分:1)

我尝试过多种变体,找不到($a == $b) !== ($b == $a)的情况但迄今为止没有一种情况有效:

<?php

$a = 0;
$b = "0";

echo (($a == $b) == ($b == $a)) ? "OK\n" : "FAIL\n";

$a = 0;
$b = NULL;

echo (($a == $b) == ($b == $a)) ? "OK\n" : "FAIL\n";

$a = 0;
$b = false;

echo (($a == $b) == ($b == $a)) ? "OK\n" : "FAIL\n";

$a = false;
$b = NULL;

echo (($a == $b) == ($b == $a)) ? "OK\n" : "FAIL\n";

$a = "";
$b = NULL;

echo (($a == $b) == ($b == $a)) ? "OK\n" : "FAIL\n";

$a = "NULL";
$b = NULL;

echo (($a == $b) == ($b == $a)) ? "OK\n" : "FAIL\n";

$a = 0.000000000000000000000000001;
$b = 0;

echo (($a == $b) == ($b == $a)) ? "OK\n" : "FAIL\n";

$a = array();
$b = array();

echo (($a == $b) == ($b == $a)) ? "OK\n" : "FAIL\n";

所以,我放弃了这一点。欢迎创意!