web-dev-qa-db-ja.com

PHPで変数のコピーを明示的に作成するにはどうすればよいですか?

StdClassオブジェクトの配列があります。変数に割り当てると、変数をコピーするのではなく、元の変数を参照します。私のコードは次のようなものです:

for ( $i = 0, $len = count($rows); $i < $len; $i++ )
{
    $row = $rows[$i];
    echo $rows[$i]->games;
    $row->games = 'test';
    echo $rows[$i]->games;
}

最初のエコーは通常の値を出力しますが、2番目のエコーは「テスト」を出力します。プロパティを$row(コピーする必要があります)に設定していますが、実際には元の配列要素に設定しています。

これはなぜですか。また、コピーを変更しても元のコピーが変更されないように、実際にコピーを作成するにはどうすればよいですか。

22
DisgruntledGoat

clone キーワードを使用します。

$copy = clone $object;

注意することが重要:

オブジェクトのクローンが作成されると、PHP 5は、オブジェクトのすべてのプロパティの浅いコピーを実行します。他の変数への参照であるプロパティは、参照のままになります。

それは素晴らしい魔法の方法が付属しています:

クローン作成が完了すると、__ clone()メソッドが定義されている場合、新しく作成されたオブジェクトの__clone()メソッドが呼び出され、変更が必要な必要なプロパティを許可します。

58
Pekka