52
49

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PHPのobjectの代入にはcloneを使おうって話

Last updated at Posted at 2016-08-11

環境

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になろう
図があってとてもわかりやすいです。

52
49
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
52
49

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?