Bir nesnenin tüm özelliklerinin aynen kopyalanarak çoğaltılması her zaman istenilen durum değildir. Kurucuların kopyalanması iyi bir örnektir, bir GTK penceresini temsil eden bir nesneniz varsa ve bu nesne GTK penceresine ait özkaynağı tutuyorsa, bu nesnenin kopyasını oluşturduğunuzda, yeni nesnenin önceki pencere ile aynı özelliklere sahip yeni bir pencereye sahip olmasını ve önceki nesne ile aynı şekilde pencereye ait özkaynağı tutuyor olmasını isteyebilirsiniz. Bir diğer örnek, nesneniz kullandığı başka bir nesneye ait bir gönderim tutuyorsa, ebeveyn nesne kopyalandığında diğer nesnenin de yeni bir örneğinin oluşturulmasını isteyebilirsiniz, yani ebeveynin kopyasının kendine ait ayrı bir kopyası olur.
Bir nesnenin kopyası (mümkünse nesnenin
__clone() yöntemini
çağıran) clone
anahtar sözcüğü kullanılarak oluşturulur. Bir
nesnenin __clone() yöntemi doğrudan
doğruya çağrılamaz.
$nesnenin_kopyası = clone $object;
Bir nesne kopyalandığında, PHP 5 nesnenin tüm özelliklerinin yüzeysel bir kopyasını çıkartacaktır. Diğer değişkenlere birer gönderim olan tüm özellikler gönderim olarak kalacaktır.
Kopyalama tamamlanır tamamlanmaz, bir __clone() yöntemi tanımlanmışsa, değişmesi gereken lüzumlu tüm özelliklere izin vermek için yeni oluşturulan nesnenin __clone() yöntemi çağrılacaktır.
Örnek 1 - Bir nesnenin kopyalanması
<?php
class AltNesne
{
static $örnek_sayısı = 0;
public $örnek;
public function __construct()
{
$this->örnek = ++self::$örnek_sayısı;
}
public function __clone()
{
$this->örnek = ++self::$örnek_sayısı;
}
}
class KopyalanabilirNesnem
{
public $nesne1;
public $nesne2;
function __clone()
{
// this->nesne1'in bir kopyasını oluşturmak için
// zorlayalım, yoksa aynı nesneyi gösterecek.
$this->nesne1 = clone $this->nesne1;
}
}
$nes = new KopyalanabilirNesnem();
$nes->nesne1 = new AltNesne();
$nes->nesne2 = new AltNesne();
$nes2 = clone $nes;
print("Özgün Nesne:\n");
print_r($nes);
print("Kopya Nesne:\n");
print_r($nes2);
?>
Yukarıdaki örneğin çıktısı:
Özgün Nesne: KopyalanabilirNesnem Object ( [nesne1] => AltNesne Object ( [örnek] => 1 ) [nesne2] => AltNesne Object ( [örnek] => 2 ) ) Kopya Nesne: KopyalanabilirNesnem Object ( [nesne1] => AltNesne Object ( [örnek] => 3 ) [nesne2] => AltNesne Object ( [örnek] => 2 ) )