为什么 php (===) 中的相同运算符因 DateTimeImmutable 对象而失败?

Why identical operator in php (===) fails with DateTimeImmutable objects?

提问人:hosseio 提问时间:3/7/2018 更新时间:3/7/2018 访问量:1126

问:

我有两个对象,期望它们是相同的,我惊讶地发现它们不是。即,为什么是以下?DateTimeImmtablefalse

<?php
$d = new \DateTimeImmutable('2018-01-01');
$e = new \DateTimeImmutable('2018-01-01');

var_dump($d === $e);

当然评估为$d == $etrue

php 比较 相等 身份运算符

评论


答:

3赞 iainn 3/7/2018 #1

这与对象无关,只是 PHP 如何处理对象比较。从手册:DateTimeImmutable

使用标识运算符 (===) 时,当且仅当对象变量引用同一类的同一实例时,它们才相同。

使用此运算符比较任意两个不同的实例将始终返回 false,而不考虑任何属性的值。

评论

0赞 hosseio 3/7/2018
但只有对象,如果我理解得很好。这不适用于标量,对吧?
1赞 iainn 3/7/2018
是的,只针对对象。对于标量,一般规则是两个变量必须具有相同的值并且属于相同的类型。也就是说,在任何“类型杂耍”发生之前,它们是相同的值。
0赞 Mat 8/13/2023
由于这似乎在任何地方都没有提到,因此您可以通过比较它们的时间戳来使用严格相等性来获得预期结果: .0 === $d->getTimestamp() - $e->getTimestamp()
2赞 Bilal Ahmed 3/7/2018 #2
$d = new \DateTimeImmutable('2018-01-01');
$e = new \DateTimeImmutable('2018-01-01');

var_dump($d);
var_dump($e);

输出为

object(DateTimeImmutable)[1]
  public 'date' => string '2018-01-01 00:00:00' (length=19)
  public 'timezone_type' => int 3
  public 'timezone' => string 'Europe/Paris' (length=12)
object(DateTimeImmutable)[2]
  public 'date' => string '2018-01-01 00:00:00' (length=19)
  public 'timezone_type' => int 3
  public 'timezone' => string 'Europe/Paris' (length=12)

根据 PHP 手册:它们将对象作为不同的对象或实例处理,当您比较两个对象时,它们将 2 个对象作为不同的对象处理

当您用于比较对象或实例(同一类的两个实例)时,它们会将这些对象作为不同的对象处理,结果是假的===

评论

0赞 hosseio 3/7/2018
正是我检查的。我误解了认为这和标量一样工作