【问题标题】:Why identical operator in php (===) fails with DateTimeImmutable objects?为什么 php (===) 中的相同运算符使用 DateTimeImmutable 对象失败?
【发布时间】:2023-10-13 01:45:01
【问题描述】:

我有两个DateTimeImmtable 对象,并期望它们是相同的,我很惊讶地发现它们不是。即,为什么下面是false

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

var_dump($d === $e);

当然$d == $e 计算结果为true

【问题讨论】:

    标签: php comparison equality identity-operator


    【解决方案1】:
    $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 个对象视为不同的对象

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

    【讨论】:

    • 正是我检查的内容。我误解了认为这可以像标量一样工作
    【解决方案2】:

    这与DateTimeImmutable 对象无关,这只是PHP 处理对象比较的方式。来自the manual

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

    无论任何属性的值如何,使用此运算符比较任何两个不同的实例都将始终返回 false。

    【讨论】:

    • 但只有对象,如果我理解得很好的话。这不适用于标量,对吧?
    • 是的,仅用于对象。对于标量,一般规则是两个变量必须具有相同的值和相同的类型。也就是说,它们是相同的值,任何"type juggling"发生之前。
    最近更新 更多