__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.99Secara 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: 0method __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.
Tantangan
MudahMari 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 classDocumentyang merepresentasikan dokumen dengan versi. Gunakan constructor promotion untuk mendefinisikan$titlepublik (string),$contentpublik (string), dan$versionpublik (integer, dengan nilai default 1). Tambahkan property$createdAtprivat untuk menyimpan timestamp saat ini (gunakandate('Y-m-d H:i:s')di constructor). Dokumenmu memerlukan:getCreatedAt(): mengembalikan timestamp pembuatan__clone(): saat dokumen di-clone, versinya harus bertambah 1, dan$createdAtharus 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. BuatDocumentdengan 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
?>Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengenalan OOPclass vs objectKata Kunci $thismethodpropertyConstructor (__construct)Destructor (__destruct)Ringkasan: Kalkulator Sederhana4Pewarisan
Pewarisan DasarKata Kunci parent::Penimpaan methodKata Kunci finalClass AbstrakRingkasan: Hierarki Karyawan7Enkapsulasi
Public, Protected, PrivateModifier Akses secara MendalamGetter dan SetterPenyembunyian InformasiPromosi Constructor (8.0)Ulasan: Sistem Catatan Siswa2Namespace dan Autoloading
Pengenalan NamespaceKata Kunci useStandar Autoloading PSR-4Autoloader ComposerRingkasan: Proyek yang Terorganisasi5Interface dan Kontrak
Pengenalan InterfaceMengimplementasikan InterfaceImplementasi Beberapa InterfaceInterface vs Abstract ClassPetunjuk Tipe dengan InterfaceRekap: Kalkulator Bentuk8Magic Methods
Pengantar Magic Methods__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Cloning Object__serialize & __unserializeRingkasan: Koleksi Kustom11Sistem Tipe Data dan Penanganan Error
Deklarasi TipeTipe NullableTipe Union dan IntersectionClass ExceptionHierarki Exception KustomTry, Catch, FinallyRekap: Validator Form3Property dalam class
Property instance vs staticKonstanta dalam classMethod & property staticProperty private & protectedProperty readonly (PHP 8.1)Ulasan: Pengelola Rekening Bank6Polimorfisme
Meninjau Kembali Method OverridingPolimorfisme melalui AntarmukaPetunjuk Tipe dan Tipe UnionPengikatan Statis TertundaRangkuman: Pemroses PembayaranLatihan sendiri: Compiler PHP online