我已经习惯于在PHP(===)中使用相同的比较运算符,而不是使用相等的比较运算符(==).我在使用PHP的内置DateTime对象时遇到了一个问题.我很困惑为什么相等的比较返回true,但相同的比较在下面的代码中返回false?
码:
$test1 = new DateTime("Now"); // What I thought were identical objects
$test2 = new DateTime("Now"); //
$test3 = new DateTime("tomorrow");
echo("test1: ");
var_dump($test1);
echo("<br/>test2: ");
var_dump($test2);
echo("Now === Now: ");
var_dump($test1 === $test2);
echo("<br/>Now == Now: ");
var_dump($test1 == $test2);
echo("<br/>Now < Now: ");
var_dump($test1 < $test2);
echo("<br/>Now > Now: ");
var_dump($test1 > $test2);
echo("<br/>Now < tomorrow: ");
var_dump($test2 < $test3);
echo("<br/>Now > tomorrow: ");
var_dump($test2 > $test3);
输出:
test1: object(DateTime)#36 (3) { ["date"]=> string(19) "2015-06-23 14:44:25" ["timezone_type"]=> int(3) ["timezone"]=> string(15) "America/Chicago" }
test2: object(DateTime)#37 (3) { ["date"]=> string(19) "2015-06-23 14:44:25" ["timezone_type"]=> int(3) ["timezone"]=> string(15) "America/Chicago" }
Now === Now: bool(false)
Now == Now: bool(true)
Now < Now: bool(false)
Now > Now: bool(false)
Now < tomorrow: bool(true)
Now > tomorrow: bool(false)
解决方法:
在对象比较的情况下===不仅检查值和对象类型,但它也将检查引用.这就是为什么在你的情况下===因为两个单独的实例而返回false.
只是为了澄清检查一下: –
注意: – 在第一种情况下,两个单独的实例是$test1和$test2,这就是为什么===返回false甚至是对象类型,并且值相等.
但在第二种情况下,因为$test1和$test2是相同的引用,所以它表明是真的.
同样在正常变量的情况下===仅检查值和数据类型.其中as ==始终只检查值,只要数据类型不同,它就不会给出正确的输出.因此在使用==时要小心.谢谢.