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

Reply via email to