Menu
Coddy logo textTech

__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.99

Varsayı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: 0

Sığ 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.

challenge icon

Görev

Kolay

Klonlamanı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 bir Document sı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 (kurucuda date('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 $createdAt geç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 bir Document oluş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

?>
quiz iconKendini test et

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

Kendi başına pratik yap: Online PHP derleyicisi