第10章 オブジェクト指向構文 / 第4回 模擬試験
PHPのオブジェクトの比較に関する次の記述のうち、正しいものはどれか。
`==`によるオブジェクト比較は、クラスが同じでプロパティの値がすべて等しい場合に`true`になる。
正解
`===`によるオブジェクト比較は、プロパティの値が等しければ別インスタンスでも`true`になる。
オブジェクトの比較は、PHPでは常にエラーになる。
オブジェクトは配列と全く同じ方法で比較される。
解説
オブジェクトを`==`で比較すると、「同じクラスのインスタンスであり、かつすべてのプロパティの値が等しい」場合に`true`になります。
他の選択肢が誤りである理由は次の通りです。
・`===`によるオブジェクト比較は、プロパティの値が等しいだけでなく「全く同一のインスタンス」でなければ`true`になりません。プロパティの値が同じでも、別々に`new`した異なるインスタンスであれば`===`は`false`になります。
・オブジェクトの比較自体はエラーにならず、`==`や`===`で正常に比較できます。
・オブジェクトの比較(プロパティの値やインスタンスの同一性を見る)と、配列の比較(要素の値やキーの一致を見る)は判定基準が異なります。「全く同じ方法」ではありません。
例:
```
class Point {
public function __construct(public int $x, public int $y) {}
}
$a = new Point(1, 2);
$b = new Point(1, 2);
var_dump($a == $b); // true(クラスとプロパティの値が同じ)
var_dump($a === $b); // false(別インスタンス)
var_dump($a === $a); // true(同一インスタンス)
```
(参照: 独習PHP 第4版 第10章 オブジェクト指向構文 10.6.2節 オブジェクトの比較 p.534)