__clone ve Nesne Klonlama
Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 48 / 91.
PHP'de bir nesneyi başka bir değişkene atadığında bir kopya oluşturmazsın - her iki değişken de aynı nesneyi gösterir. Gerçekten bağımsız bir kopya oluşturmak için clone anahtar sözcüğünü kullanman gerekir:
<?php
class Product {
public function __construct(
public string $name,
public float $price
) {}
}
$original = new Product("Laptop", 999.99);
$copy = clone $original;
$copy->price = 899.99;
echo $original->price . " - " . $copy->price;
Çıktı:
999.99 - 899.99Varsayılan olarak PHP, sığ kopyalama gerçekleştirir; tüm özellik değerlerini doğrudan kopyalar. Bu, skaler değerler için sorunsuz çalışır, ancak nesnenizin içindeki nesneler hâlâ aynı örneğe başvurur. __clone() sihirli yöntemi bu davranışı özelleştirmenizi sağlar:
<?php
class Order {
public function __construct(
public int $id,
public array $items = []
) {}
public function __clone(): void {
$this->id = 0;
$this->items = [];
}
}
$order1 = new Order(101, ["Book", "Pen"]);
$order2 = clone $order1;
echo "Original: " . $order1->id . ", Clone: " . $order2->id;
Output:
Original: 101, Clone: 0Sığ kopya oluşturulduktan sonra yeni nesne üzerinde __clone() yöntemi çağrılır. Kimlikleri sıfırladığınız, iç içe nesnelerin yeni kopyalarını oluşturduğunuz veya klonun gerçekten bağımsız olması için gereken temizleme işlemlerini gerçekleştirdiğiniz yer burasıdır.
Görev
KolayKlonlamanın nasıl bağımsız kopyalar oluşturduğunu ve __clone() sihirli yönteminin bir nesne klonlandığında ne olacağını özelleştirmenize nasıl olanak tanıdığını gösteren bir belge sürüm oluşturma sistemi geliştirelim.
Kodunuzu iki dosyaya ayıracaksınız:
Document.php: Sürümlendirilmiş bir belgeyi temsil eden birDocumentsınıfı oluşturun. Genel bir$title(string), genel bir$content(string) ve varsayılan değeri 1 olan genel bir$version(integer) tanımlamak için kurucu parametre tanımını kullanın. Geçerli zaman damgasını depolayan özel bir$createdAtözelliği ekleyin (kurucudadate('Y-m-d H:i:s')kullanın). Belgenizin şunlara ihtiyacı vardır:getCreatedAt(): oluşturulma zaman damgasını döndürür__clone(): bir belge klonlandığında sürüm 1 artırılmalı ve$createdAtgeçerli zaman damgasına sıfırlanmalıdır (klon, "şimdi" oluşturulan yeni bir sürümdür)
main.php: Document dosyasını dahil edin. Üç girdi alacaksınız: bir başlık, içerik ve klonlanan sürüm için yeni bir içerik dizesi. Başlık ve içerikle birDocumentoluşturun. Ardından yeni bir sürüm oluşturmak için belgeyi klonlayın ve klonun içeriğini yeni içerik dizesiyle güncelleyin. Dört satır yazdırın:- Özgün belgenin sürümü
- Klonlanan belgenin sürümü
- Özgün belgenin içeriği
- Klonlanan belgenin içeriği
Bu sistem, __clone() yönteminin klonlama sırasında ne olacağını kontrol etmenize nasıl olanak tanıdığını gösterir. Özgün belge sürümünü ve oluşturulma zamanını korurken klon, yeni ve güncel bir zaman damgasına sahip yeni bir sürüme otomatik olarak dönüşür. Bu, her klonun yeni bir revizyonu temsil ettiği belge geçmişini izlemek için idealdir.
Kendin dene
<?php
require_once 'Document.php';
// Girdileri oku
$title = trim(fgets(STDIN));
$content = trim(fgets(STDIN));
$newContent = trim(fgets(STDIN));
// TODO: Başlık ve içerikle bir Document oluştur
// TODO: Yeni bir sürüm oluşturmak için belgeyi klonla
// TODO: Klonun içeriğini yeni içerik dizesine güncelle
// TODO: Dört satır yazdır:
// 1. Orijinal belgenin sürümü
// 2. Klonlanmış belgenin sürümü
// 3. Orijinal belgenin içeriği
// 4. Klonlanmış belgenin içeriği
?>Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesneler$this Anahtar SözcüğüMetotlarÖzelliklerYapıcı (__construct)Yıkıcı (__destruct)Tekrar - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımparent:: Anahtar SözcüğüMetot Geçersiz Kılmafinal Anahtar SözcüğüSoyut SınıflarTekrar - Çalışan Hiyerarşisi7Kapsülleme
Public, Protected, PrivateErişim Belirleyicileri DerinlemesineGetter ve Setter'larBilgi GizlemeYapıcı Özellik Terfisi (8.0)Tekrar - Öğrenci Kayıt Sistemi10İleri Düzey OOP Kavramları
Composition ve KalıtımBağımlılık EnjeksiyonuAnonim SınıflarEnum'lar (PHP 8.1)Fiber'lar (PHP 8.1)Nesne Klonlamaya Derinlemesine BakışÜreteçler ve Yineleyiciler13Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıBileşik KalıpDepo Kalıbı2Namespace’ler ve Autoloading
Namespace’lere Girişuse Anahtar SözcüğüPSR-4 Autoloading StandardıComposer AutoloaderTekrar - Düzenli Proje5Arayüzler ve Sözleşmeler
Arayüzlere GirişArayüzleri UygulamaBirden Çok Arayüz UygulamaArayüz ve Soyut Sınıf KarşılaştırmasıArayüzlerle Tür İpuçlarıTekrar - Şekil Hesaplayıcı8Sihirli Metotlar
Sihirli Metotlara Giriş__toString ve __debugInfo__get, __set, __isset, __unset__call ve __callStatic__clone ve Nesne Klonlama__serialize ve __unserializeTekrar - Özel Koleksiyon3Sınıf Özellikleri
Örnek ve Statik ÖzelliklerSınıflarda SabitlerStatik Metotlar ve ÖzelliklerPrivate ve Protected ÖzelliklerSalt Okunur Özellikler (PHP 8.1)Tekrar - Banka Hesabı Yöneticisi6Çok Biçimlilik
Metot Geçersiz Kılmayı Yeniden Ele AlmaArayüzler Yoluyla Çok BiçimlilikTür İpuçları ve Birleşim TürleriGeç Bağlanan Statik ÇağrılarÖzet - Ödeme İşlemcisi9Trait'ler
Trait'lere GirişBirden Çok Trait KullanımıTrait Çakışmalarını ÇözümlemeTrait'lerde Soyut MetotlarTrait'ler ve Kalıtım Karşılaştırması12Tasarım Desenleri 1. Bölüm
Tasarım Desenlerine GirişSingleton DeseniFactory DeseniObserver DeseniStrategy DeseniKendi başına pratik yap: Online PHP derleyicisi