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 ) )
PHP 7.0.0 yeni kopyalanmış bir nesnenin üyesine tek bir ifadede erişme imkanını sağladı:
Örnek 2 - Yeni kopyalanmış nesnenin üyesine erişim
<?php
$dateTime = new DateTime();
echo (clone $dateTime)->format('Y');
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
2016