Objektskloning
Kloning av objekt
Att skapa en kopia av ett objekt med fullständigt replikerade egenskaper är inte alltid önskvärt. Ett bra exempel på behovet av kopieringskonstruktorer är om du har ett objekt som representerar ett GTK-fönster och objektet håller resursen för detta GTK-fönster. När du skapar en dubblett kanske du vill skapa ett nytt fönster med samma egenskaper och låta det nya objektet hålla resursen för det nya fönstret. Ett annat exempel är om ditt objekt håller en referens till ett annat objekt som det använder, och när du replikerar huvudobjektet vill du skapa en ny instans av detta andra objekt så att replikan har sin egen separata kopia.
En kopia av ett objekt skapas genom att använda nyckelordet `clone` (som anropar objektets `__clone()`-metod om möjligt).
$kopia_av_objekt = clone $objekt;
När ett objekt klonas kommer PHP att utföra en grundläggande kopia av alla objektets egenskaper. Alla egenskaper som är referenser till andra variabler kommer att förbli referenser.
__clone(): void
När kloningen är klar, om en `__clone()`-metod är definierad, kommer den nyskapade objektets `__clone()`-metod att anropas för att möjliggöra eventuella nödvändiga ändringar av egenskaper.
Exempel #1 Kloning av ett objekt
<?php class SubObject { static $instances = 0; public $instance; public function __construct() { $this->instance = ++self::$instances; } public function __clone() { $this->instance = ++self::$instances; } } class MyCloneable { public $object1; public $object2; function __clone() { // Tvinga en kopia av this->object, annars // kommer det att peka på samma objekt. $this->object1 = clone $this->object1; } } $obj = new MyCloneable(); $obj->object1 = new SubObject(); $obj->object2 = new SubObject(); $obj2 = clone $obj; print "Originalobjekt:\n"; print_r($obj); print "Klonat objekt:\n"; print_r($obj2); ?>
Exemplet ovan kommer att ge följande resultat:
Originalobjekt: MyCloneable Object ( [object1] => SubObject Object ( [instance] => 1 ) [object2] => SubObject Object ( [instance] => 2 ) ) Klonat objekt: MyCloneable Object ( [object1] => SubObject Object ( [instance] => 3 ) [object2] => SubObject Object ( [instance] => 2 ) )
Det är möjligt att komma åt en medlem av ett nyklonat objekt i ett enda uttryck:
Exempel #2 Komma åt medlem av ett nyklonat objekt
<?php $dateTime = new DateTime(); echo (clone $dateTime)->format('Y'); ?>
Exemplet ovan kommer att ge något liknande:
2016