こんなコードがありました
PHPに限った話ではないですが。
こんなコードがありました。
function changeUserStatus($user) { $user->status = 2 return $user; } echo $user->status; // 1 $changed_user = $this->changeUserStatus($user); echo $user->status; //1. ?? echo $changed_user->status; //2. ??
さて。このとき1,2の値はどうなるでしょうか。
正解は
両方共2になりますね。
なぜか。インスタンスの参照先を渡して、インスタンスの値をそのまま書き換えてしまったから。
オブジェクトのインスタンスを扱うときは、結構やりがち。
どうしたらよかった?
もし、元の値を変更したくなかったのなら以下
function changeUserStatus($user) { //ここを書き換える $changed_user = clone($user); $changed_user->status = 2 return $changed_user; } echo $user->status; // 1 $changed_user = $this->changeUserStatus($user); echo $user->status; // 1 echo $changed_user->status; // 2
clone()関数で全く同じものを生成して、それを書き換えてreturnする。