【PHP】objectは参照型

以下のようなコードを書いていた際に問題が起きた。

<?php
$hoge = new stdClass();
$hoge->a = 1;
$fuga = $hoge;
$fuga->a = 2;
print_r($hoge);

$hoge->a1だと思っていたのに、出力は以下のようになった。

stdClass Object
(
    [a] => 2
)

なぜ?

リファレンスにちゃんと書いてあった...

オブジェクトが引数として渡されたり返り値となったり あるいは別の変数に代入されたりした場合、 それはエイリアスではありません。ID のコピーを保持し、 同じオブジェクトを指すようになるのです。
PHP: オブジェクトと参照 - Manual

というわけなので、代入せずにcloneしよう。

<?php
$hoge = new stdClass();
$hoge->a = 1;
$fuga = clone $hoge;
$fuga->a = 2;
print_r($hoge);
stdClass Object
(
    [a] => 1
)

知らなかった...