第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)