20

クラス a があり、 new を使用してインスタンス化しました

$obja = new a;

以下の2行の違いを知っています

$obja2 = $ojba;
$obja2 = clone $obja;

ただし、クラスで __clone を宣言しても宣言しなくても、最初の行 $obja2 は $obja メモリ空間を参照し、2 行目は $obja のコピーを作成します。ここまでは明らかです。

では、なぜ php には魔法のメソッド __clone があるのでしょうか? $obja2 = clone $obja; を使用しているときに、__clone 内に記述された一連のコードを実行するためだけですか?

誰かがそれをよりよく理解するのを手伝ってください。

4

2 に答える 2

24
void __clone ( void )

複製が完了すると、__clone()メソッドが定義されている場合、新しく作成されたオブジェクトの__clone()メソッドが呼び出され、必要なプロパティを変更できるようになります。

http://php.net/manual/en/language.oop5.cloning.php#object.clone

はい、操作が完了した後のコールバックです。cloneそれ以上でもそれ以下でもありません。

于 2012-12-20T11:10:47.073 に答える
22

clonePHPのキーワードは、浅いコピーを表します。

ディープ コピーを実現するには、マジック メソッドを実装する必要があります。__clone

simple キーワードを使用して、別のクラスのオブジェクトであるメンバーを持つオブジェクトを複製すると、cloneその 2 番目のオブジェクトへの同じ参照が保持されます。

ここで、次のようなディープ コピーが役に立ちます。

public function __clone()
{
    $this->someOtherObject = clone $this->someOtherObject;
}

これにより、クローンがdeepになることが保証されます。つまり、メンバー オブジェクトへの元の参照を保持するだけでなく、メンバー オブジェクトもクローンされます。

于 2012-12-20T11:10:28.207 に答える