PHP
datetime
==

PHPでは異なるクラスのインスタンスが==になることがある

==による比較は、マニュアルでは


二つのオブジェクトのインスタンスは、 同じ属性と値 (値の比較は == によるもの) を有し、同じクラスのインスタンスである場合に、 等しいとされます。


具体的には同じクラスであり、かつインスタンス内の全てのプロパティが等しければイコールになります。

しかし直後にはこんなことも書いてあるわけです。


拡張モジュール内では、自前で作成したオブジェクトの (== による) 比較方法を独自に定義することができます。


ということで先日実例を挙げました。

    $x = new \DateTime('2018/01/01 00:00:00');

$y = new \DateTime('2018/01/01 00:00:00');
$y->foo = 'bar';

var_dump($x == $y); // true

\DateTimeクラスは==がオーバーライドされており、==のチェックはsseusプロパティだけを見るようになっています。

それ以外のプロパティを突っ込んだとしても、==による比較は平然とtrueになります

ここで終わっていればまだよかったのですが、ふと思いついたので試してみた

    $x = new \DateTime('2018/01/01 00:00:00');

$y = new \DateTimeImmutable('2018/01/01 00:00:00');

var_dump($x == $y); // true

クラスが異なるのに==が等しくなってしまいました。

さすがにこれはどうなんだ。