第10章 オブジェクト指向構文 / 第5回 模擬試験

PHPのオブジェクトの複製(クローン)に関する次の記述のうち、正しいものはどれか。

オブジェクトを複製するには`clone`キーワードを使用する。 正解
オブジェクトの代入(`$b = $a;`)は、常にオブジェクトを複製(クローン)する。
PHPにはオブジェクトを複製する仕組みが存在しない。
`clone`キーワードは、プロパティが配列型の場合には使用できない。
解説
PHPのオブジェクトを明示的に複製(コピー)したい場合は、`clone $obj`のように`clone`キーワードを使用します。 他の選択肢が誤りである理由は次の通りです。 ・オブジェクトを`$b = $a;`のように代入しても、複製は行われません。`$a`と`$b`は同じインスタンスを指す変数になり、片方を変更するともう片方にも影響します。複製したい場合は明示的に`clone`を使う必要があります。 ・PHPには`clone`キーワードによるオブジェクト複製の仕組みがあります。「存在しない」は誤りです。 ・`clone`は、プロパティが配列型であっても問題なく使用できます(ただしプロパティがオブジェクト型の場合、デフォルトでは複製後もそのオブジェクトへの参照が共有される「浅いコピー」になる点には注意が必要で、深いコピーが必要な場合は`__clone()`マジックメソッドをオーバーライドします)。 例: ``` class Box { public array $items = []; } $a = new Box(); $b = $a; // 複製ではない。$aと$bは同じインスタンス $c = clone $a; // 複製。$aとは別のインスタンス $b->items[] = 'x'; var_dump($a->items === $b->items); // true(同じインスタンスなので影響しあう) ``` (参照: 独習PHP 第4版 第10章 オブジェクト指向構文 10.6.1節 オブジェクトの代入 p.533〜534)

あわせて読みたい解説記事