PHP 对象的克隆
概述
- オブジェクトのクローンについてまとめる
我想做的事情
Aクラスのオブジェクトを$aに格納してからそれを複製して$bに格納し別のオブジェクトとして扱いたい。
下記のようなコードを考えた。
}
}
// インスタンス化してオブジェクトを$aに格納
$a = new A();
echo $a->str . “\n”;
$b = $a;
$b->save(‘更新した文字列’);
// 「更新した文字列」が出力されてほしい
echo $b->str . “\n”;
// この時 intの1が出力されてほしい
echo $a->str . “\n”;
下記のように出力された。
1
更新した文字列
更新した文字列
期待と違う。本当は下記のように出力されてほしい。
1
更新した文字列
1
厳密には異なるがオブジェクトは参照渡しのような振る舞いをするらしい。そりゃいくら途中で$b = $a;のように記載して$bにだけ変更を加えても$aにも影響が及ぶわけだ。
https://www.php.net/manual/ja/language.oop5.references.php
下記のようにcloneを用いることでオブジェクトの複製を作成する事ができる。
}
}
$a = new A();
echo $a->str . “\n”;
$b = clone $a;
$b->save(‘更新した文字列’);
echo $b->str . “\n”;
echo $a->str . “\n”;
期待する出力を得ることもできた。
1
更新した文字列
1
ちなみにクラスに __clone()のマジックメソッドを記載して中に処理を書くことでクローン時のみ実行される処理を記載する事ができる。
}
}
$a = new A();
echo $a->str . “\n”;
$b = clone $a;
$b->save(‘更新した文字列’);
echo $b->str . “\n”;
echo $a->str . “\n”;
下記のように出力される。
1
cloneしてます〜
更新した文字列
1
文献索引
-
- https://www.php.net/manual/ja/language.oop5.cloning.php
-
- https://www.php.net/manual/ja/language.oop5.references.php
- https://www.php.net/manual/ja/language.oop5.magic.php