This code:
<?php
declare(strict_types=1);
class Foo
{
public string $foo;
public function __construct(
string $foo
) {
$this->foo = $foo;
}
}
$a = new Foo('bar');
$b = new Foo('buzz');
$c = new Foo('bar');
echo "\$a == \$b: "; var_dump($a == $b);
echo "\$a == \$c: "; var_dump($a == $c);
echo "\$a != \$b: "; var_dump($a != $b);
echo "\$a != \$c: "; var_dump($a != $c);
echo "\$a === \$b: "; var_dump($a === $b);
echo "\$a === \$c: "; var_dump($a === $c);
echo "\$a !== \$b: "; var_dump($a !== $b);
echo "\$a !== \$c: "; var_dump($a !== $c);
?>
Will output:
<pre>
$a == $b: bool(false)
$a == $c: bool(true)
$a != $b: bool(true)
$a != $c: bool(false)
$a === $b: bool(false)
$a === $c: bool(false)
$a !== $b: bool(true)
$a !== $c: bool(true)
</pre>
Using:
php -v
PHP 8.0.7 (cli) (built: Jun 2 2021 04:04:16) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.7, Copyright (c) Zend Technologies
with Zend OPcache v8.0.7, Copyright (c), by Zend Technologies
with Xdebug v3.0.2, Copyright (c) 2002-2021, by Derick Rethans
How is that even possible ?
- I declared strict_types to avoid type coercion
- My data structure is opaque (all properties are private),
How does the engine succeeds in comparing my objects ? Isn't it supposed
to be always false for == and === and always true for != and !== ?
I am missing something ?
Regards,
--
Pierre