7

DateTime の属性を持つ stdClass オブジェクトを複製しようとしています。しかし、それは失敗します。クローンが機能していないようです。独自の __clone() メソッドを作成する必要がありますか? ここで何が問題なのですか?

コード:

$object = new stdClass;
$object->date = new DateTime();
var_dump($object->date);

$cloned = clone($object);
$object->date->modify('+1 day');
var_dump($cloned->date);

出力:

object DateTime (
    ->date = string (19) '2013-04-11 11:54:00'
    ->timezone_type = int 3
    ->timezone = string (13) 'Europe/Berlin'

object DateTime (
    ->date = string (19) '2013-04-12 11:54:00'
    ->timezone_type = int 3
    ->timezone = string (13) 'Europe/Berlin'
4

3 に答える 3

4

オブジェクトのクローンを作成すると、オブジェクトのすべてのプロパティがオブジェクトの新しいインスタンスに単純にコピーされます。事実上、これは:

$cloned = new stdClass;
$cloned->date = $object->date;

おそらくご存じのとおり、オブジェクトを別の変数に代入してもオブジェクトは複製されません。オブジェクトはまだ 1 つしかありませんが、2 つの参照があります。

オブジェクトをディープ クローンするには、__cloneメソッドcloneを使用してカスタム クラスを実装し、その子オブジェクトを手動で実装する必要があります。

于 2013-04-11T10:03:31.353 に答える