Menu
CoddyTech

__clone & Cloning Object

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan PHP di Coddy. Pelajaran 48 dari 91.

Saat kamu menetapkan satu object ke variabel lain di PHP, kamu tidak membuat salinan. Kedua variabel menunjuk ke object yang sama. Untuk membuat salinan independen yang sebenarnya, kamu perlu menggunakan kata kunci clone:

<?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;

Output:

999.99 - 899.99

Secara default, PHP melakukan salinan dangkal, yaitu menyalin semua nilai property secara langsung. Ini bekerja dengan baik untuk nilai skalar, tetapi object di dalam object-mu tetap merujuk ke instance yang sama. Magic method __clone() memungkinkan kamu menyesuaikan perilaku ini:

<?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

method __clone() dipanggil pada object baru setelah salinan dangkal dibuat. Di sinilah kamu mereset ID, membuat salinan baru dari object bersarang, atau melakukan pembersihan yang diperlukan agar hasil kloning benar-benar independen.

challenge icon

Tantangan

Mudah

Mari kita buat sistem pembuatan versi dokumen yang menunjukkan cara cloning membuat salinan independen dan cara magic method __clone() memungkinkan kamu menyesuaikan hal yang terjadi saat object di-clone.

Kamu akan mengatur kodemu dalam dua file:

  • Document.php: Buat class Document yang merepresentasikan dokumen dengan versi. Gunakan constructor promotion untuk mendefinisikan $title publik (string), $content publik (string), dan $version publik (integer, dengan nilai default 1). Tambahkan property $createdAt privat untuk menyimpan timestamp saat ini (gunakan date('Y-m-d H:i:s') di constructor). Dokumenmu memerlukan:
    • getCreatedAt(): mengembalikan timestamp pembuatan
    • __clone(): saat dokumen di-clone, versinya harus bertambah 1, dan $createdAt harus diatur ulang ke timestamp saat ini (clone tersebut adalah versi baru yang dibuat "sekarang")
  • main.php: Sertakan file Document. Kamu akan menerima tiga input: judul, konten, dan string konten baru untuk versi hasil clone. Buat Document dengan judul dan konten tersebut. Lalu clone dokumen itu untuk membuat versi baru, dan perbarui konten clone dengan string konten baru. Cetak empat baris:
    • Versi dokumen asli
    • Versi dokumen hasil clone
    • Konten dokumen asli
    • Konten dokumen hasil clone

Sistem ini menunjukkan cara __clone() memungkinkan kamu mengendalikan hal yang terjadi selama proses cloning. Dokumen asli tetap memiliki versi dan waktu pembuatan yang sama, sedangkan clone otomatis menjadi versi baru dengan timestamp yang diperbarui. Ini cocok untuk melacak riwayat dokumen, karena setiap clone mewakili revisi baru.

Coba sendiri

<?php

require_once 'Document.php';

// Baca input
$title = trim(fgets(STDIN));
$content = trim(fgets(STDIN));
$newContent = trim(fgets(STDIN));

// TODO: Buat Document dengan judul dan konten

// TODO: Klon dokumen untuk membuat versi baru

// TODO: Perbarui konten klon dengan string konten baru

// TODO: Cetak empat baris:
// 1. Versi dokumen asli
// 2. Versi dokumen hasil klon
// 3. Konten dokumen asli
// 4. Konten dokumen hasil klon

?>
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler PHP online