0
0

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 1 year has passed since last update.

PHPのオブジェクトの代入には気をつける

Posted at

はじめに

PHPのobjectについての忘備録。

これはだめ

$a = new stdClass();
$a->name = 'Yamada';

$b = $a;
var_dump($a === $b);  // bool(true)

$b->name = 'Sato';
var_dump($a === $b);  // bool(true)

var_dump($a->name)  // string(4) 'Sato'

正しい代入の仕方

$a = new stdClass();
$a->name = 'Yamada';

$b = clone $a;
var_dump($a === $b);  // bool(false) この時点で別のobjectになってる

$b->name = 'Sato';
var_dump($a->name)  // string(6) "Yamada"
var_dump($b->name)  // string(4) "Sato"

なんで

objectは参照型なので、同じオブジェクトを参照している代入元と代入先の一方でプロパティを変更すると、
結果として参照元のオブジェクトを書き換えてしまい、代入元と代入先いずれも変更が入ってしまう。

実際にオブジェクトIDを見てみると、確かにそうなっていた。

$a = new stdClass();
spl_object_id($a)  // 4274

$b = $a
spl_object_id($b)  // 4274 

// $aをcloneした$clone_aのオブジェクトID
$c = clone $a
spl_object_id($c)  // 4271

$a$bは同じオブジェクトIDなので、
どちらかのプロパティを変更しようとすると、オブジェクトID:4274のオブジェクトを操作しようとして結果として$a$bには同じ変更が入ってしまう。
オブジェクトの中身だけを別の変数に代入するためには、cloneを使うようにする。

参考

0
0
0

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?