エンジニアのひよこ_level10

毎日更新してた人。たまに記事書きます。

【PHP】油断すると破壊的な関数を書いちゃうよねって話【496日目】

こんなコードがありました

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する。