2012-12-20 4 views
12

Ich habe eine Klasse und instanziiert mit ihm neueVerwendung von __clone in PHP?

$obja = new a; 

Ich kenne den Unterschied zwischen den folgenden zwei Zeilen

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

Aber auch wenn Sie erklären oder nicht __clone in der Klasse A den ersten erklären Zeile $ obja2 verweist auf $ obja Speicherplatz und zweite Zeile erstellt eine Kopie von $ obja. Bis hier ist es mir klar.

Warum hat PHP dann eine magische Methode __clone? Ist es nur für die Ausführung einer Reihe von Codes, die in __clone geschrieben wird, während wir $ obja2 = Klon $ obja verwenden;

Jemand bitte helfen, eine bessere Vorstellung davon zu bekommen.

+0

Es existiert, um Ihnen zu erlauben, alle Objektinstanzen zu kopieren, die innerhalb des Objekts gehalten werden, wenn Sie müssen - standardmäßig würden die Zeiger kopiert werden, aber das neue Objekt würde effektiv dieselben Instanzen der untergeordneten Objekte haben. – DaveRandom

+0

@DaveRandom: Kannst du etwas einfacher erklären :) kann ein Link sein oder irgendetwas, das dies besser erklärt. Ich habe bereits gegoogelt – zamil

+1

Betrachte ein Objekt der Klasse 'A' mit einer Eigenschaft' $ innerB', die eine Instanz der Klasse 'B' enthält. Wenn Sie die Instanz von "A" klonen, wird das neue Objekt dieselbe Instanz von "B" haben. Wenn Sie clone verwenden, können Sie '$ this-> innerB = clone $ this-> innerB;' - verwenden, damit Sie auch für das neue Objekt eine neue Instanz von 'B' erhalten. Betrachten Sie [das] (http://codepad.viper-7.com/Ngssxa) gegen [das] (http://codepad.viper-7.com/51YWiC). – DaveRandom

Antwort

14
void __clone (void) 

Sobald das Klonen abgeschlossen ist, wenn eine __clone() Methode definiert ist, dann das neu __clone() Objekt erstellt Methode wird aufgerufen, alle notwendigen Eigenschaften zu ermöglichen, die geändert werden müssen.

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

Also ja, es ist ein Rückruf nach dem clone Vorgang abgeschlossen ist. Nicht mehr, nicht weniger.

+0

Also was ist die Probleme, die es erstellt, wenn ich nicht schreiben __clone() in einer Klasse? – zamil

+1

Das hängt davon ab, was Sie wollen/müssen. Ist das Standardverhalten einer PHP-Klonoperation ausreichend für das, was Sie beim Klonen von Objekten tun möchten? Dann gibt es keine Notwendigkeit. Wenn Sie weitere Schritte ausführen müssen, um einen "vollständigen" Klon zu erstellen, fügen Sie diesen Code in die Callback-Methode "__clone" ein. Lame-Beispiel: Wenn jedes Ihrer Objekte eine eindeutige ID haben muss ('$ this-> id'-Variable oder etwas in diesen Zeilen), müssen Sie nach einem Klon eine neue ID generieren, um zu vermeiden, dass zwei Objekte mit demselben übereinstimmen ICH WÜRDE. – deceze

+7

Anderes Beispiel: 'clone' erstellt eine" flache Kopie ". Dies bedeutet, dass nur das Objekt selbst geklont wird, nicht aber seine Assoziationen. Wenn also dieses Objekt von, A 'Assoziationen zu anderen Objekten hat, die zwischen verschiedenen Instanzen' A 'eindeutig sein müssen, müssen Sie auch die Zuordnungen in '__clone()' klonen: '$ this-> otherObject = clone $ this-> otherObject; ' – KingCrunch

9

Das clone Schlüsselwort in PHP stellt eine flache Kopie.

Um eine tiefe Kopie zu erreichen, müssen Sie die magische Methode __clone

implementieren Wenn Sie ein Objekt klonen, die ein Mitglied hat, die ein Objekt einer anderen Klasse mit dem einfachen clone Schlüsselwort ist, würden Sie halte den gleichen Bezug auf das zweite Objekt.

Das ist, wo die tiefe Kopie praktisch ist, mit so etwas wie folgt aus:

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

Damit Sie garantieren der Klon tief sein wird, ist es auch das Mitglied Objekte klonen bedeutet, anstatt nur den ursprünglichen Bezug zu ihnen zu behalten.

+3

's/shadow/shallow /' – DaveRandom

Verwandte Themen