2012-12-20 12 views
12

Ho una classe ae un'istanza utilizzando nuovaUso di __clone in PHP?

$obja = new a; 

So che la differenza tra il seguito due linee

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

Ma anche se si dichiara o non dichiara __clone nella classe un primo line $ obja2 si riferisce a $ obja memory space e la seconda riga crea una copia di $ obja. Fino a qui è chiaro per me.

Allora perché php sta avendo un metodo magico __clone? È solo per l'esecuzione di una serie di codici scritti all'interno di __clone mentre usiamo $ obja2 = clone $ obja;

Qualcuno, per favore, aiuta a farsi un'idea migliore.

+0

Esiste per consentire di clonare qualsiasi istanza di oggetto mantenuta all'interno dell'oggetto se è necessario: per impostazione predefinita i puntatori verrebbero copiati ma il nuovo oggetto avrebbe effettivamente le stesse istanze degli oggetti figlio. – DaveRandom

+0

@DaveRandom: Puoi spiegare un po 'più semplice :) potrebbe essere un collegamento o qualsiasi altra cosa che spieghi meglio questo. ho già fatto il mio googling – zamil

+1

Considera un oggetto di classe 'A' con una proprietà' $ innerB', che contiene un'istanza della classe 'B'. Quando clonate l'istanza di 'A', il nuovo oggetto avrà la stessa istanza di' B'. Usando il clone, potresti fare $ this-> innerB = clone $ this-> innerB; '- così otterrai anche una nuova istanza di' B' per il nuovo oggetto. Considera [questo] (http://codepad.viper-7.com/Ngssxa) contro [questo] (http://codepad.viper-7.com/51YWiC). – DaveRandom

risposta

14
void __clone (void) 

Dopo la clonazione è completa, se un metodo __clone() è definito, quindi metodo dell'oggetto appena creato __clone() saranno chiamati, per consentire eventuali proprietà necessarie che devono essere cambiati.

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

Quindi sì, è un richiamata dopo l'operazione clone è terminata. Niente di più, niente di meno.

+0

quindi quali sono i problemi che crea se non scrivo __clone() in una classe? – zamil

+1

Dipende da ciò che vuoi/devi fare. Il comportamento predefinito di un'operazione PHP 'clone' è sufficiente per ciò che si vuole fare quando si clonano oggetti? Quindi non ce n'è bisogno. Se devi fare più cose per creare un clone "completo", aggiungi quel codice nel metodo di callback '__clone'. Esempio di lame: se ciascuno dei tuoi oggetti deve avere un ID univoco (variabile $ this-> id' o qualcosa del genere), dovrai generare un nuovo ID dopo un clone per evitare di avere due oggetti con lo stesso ID. – deceze

+7

Altro esempio: 'clone' crea una" copia superficiale ". Ciò significa che solo l'oggetto stesso viene clonato, ma non le sue associazioni. Quindi se questo oggetto di 'A' ha associazioni ad altri oggetti, che devono essere unici tra le istanze di differenza' A', è necessario clonare anche le associazioni all'interno di '__clone()': $ this-> otherObject = clone $ this-> otherObject; ' – KingCrunch

9

La parola chiave clone in PHP rappresenta una copia superficiale .

Al fine di ottenere una copia completa, è necessario implementare il metodo magico __clone

Se clonare un oggetto che ha un membro, che è un oggetto di un'altra classe con la semplice clone parola chiave, si farebbe mantenere lo stesso riferimento a quel secondo oggetto.

Ecco dove il copia completa viene in aiuto, con qualcosa di simile:

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

Con questo, si garantisce il clone sarà profondo, il che significa che sarà clonare il membro oggetti pure, invece di limitarsi a mantenere il riferimento originale a loro.

+3

's/shadow/shallow /' – DaveRandom