環境
Mac OSX
PHP7
やっちまった
$a = (object)['a'=>'a'];
$b = $a;
$b->a = 'b';
print_r($a);
stdClass Object
(
[a] => b
)
正解
$a = (object)['a'=>'a'];
$b = clone $a;
$b->a = 'b';
print_r($a);
stdClass Object
(
[a] => a
)
雑な解説
答えはすごく単純で、objectを普通に代入しようとすると参照渡しになってしまい、代入先の変更が代入元にも作用してしまう。
コメントで訂正いただきました。ただしくは
objectは参照型なので,代入先でプロパティを変更したときに代入元と共通のものを操作してしまう
ということらしいです。
これを回避するには clone
を使って中身のデータだけを渡すようにすればよい。
ちなみにこれは仕様通りの動きっぽいので間違っても怒ったりしてはいけない。
ドキュメントにもそれとなく書いてある
解説記事を書いて頂きました
オブジェクトをいい感じに複製(クローン)する [myclabs/deep-copy] - 超PHPerになろう
図があってとてもわかりやすいです。