una volta creato un oggetto in PHP per farne una copia (clone) non si deve usare l'operatore di assegnazione = in quanto creerebbe solamente un nuovo riferimento all'oggetto non una copia
per creare una copia si usa la parola chiave clone
sintassi:
$oggetto2 = $oggetto1; crea un nuovo riferimento non una copia dell'oggetto1
$oggetto2 = clone $oggetto1; copia/clone dell'oggetto1
esempio: riferimento e clonazione
class Person
{
public $nome;
public $cognome;
}
$personA = new Person(); creazione nuovo oggetto Person
$personA->nome="Giulia";
$personA->cognome="Q";
assegnazione per riferimento
viene modificato anche il nome di personA
$personB = $personA;
$personB->nome="Giuseppe"; → $personA->nome="Giuseppe"
assegnamento con clonazione
non viene modificato anche il nome di personA
$personB = clone $personA;
$personB->nome="Giuseppe"; → $personA->nome="Giulia"
si può gestitire la clonazione con il metodo magico __clone implementandolo nella classe
il metodo fornisce tutte le funzionalità in caso di clonazione di un oggetto
nella clonazione vengono copiate tutte le proprietà ed in più quello che il metodo __clone impelmenta
esempio: uso del metodo magico __clone e analisi dei risultati
class Person classe Person
{
public $nome;
public $cognome;
public $azienda;
public function __clone() aggiunta all'interno della definizione della classe del metodo __clone()
{
$this->azienda = "Warner Bros";
}
}
class Azienda classe Azienda
{
public $nomeAzienda;
}
$aziendaA = new Azienda(); oggetto Azienda
$aziendaA->nomeAzienda="ciaomamma";
$person1 = new Person(); oggetto1 Person
$person1->nome="Giulia";
$person1->cognome="Q";
$person1->azienda= $aziendaA;
$person2 = clone $person1; oggetto2 Person clone (con quindi modifica automatica della proprietà azienda
$person2->nome="Giuseppe"; modifica manuale della prorpeità nome
Risultato e spiegazione:
non appena PHP eseguirà la clonazione del nuovo oggetto verrà invocato il metodo __clone()
$person2->azienda sarà uguale a "Warner Bros" perché il metodo __clone() verrà chiamato solo per l’oggetto $person2 settando il valore di $this->azienda in questo modo
oggetto: $person1
- ["nome"]=> "Giulia"
- ["cognome"]=> "Q"
- ["azienda"]=> oggetto(Azienda) {["nomeAzienda"]=> "ciaomamma"}
oggetto: $person2
- ["nome"]=> "Giuseppe"
- ["cognome"]=> "Q"
- ["azienda"]=> "Warner Bros."