Trait vs Pewarisan
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan PHP di Coddy. Pelajaran 55 dari 91.
Sekarang setelah kamu memahami cara kerja trait, mari kita perjelas kapan harus menggunakan trait dan kapan harus menggunakan pewarisan. Keduanya memungkinkan penggunaan ulang kode, tetapi memiliki tujuan berbeda dan karakteristik tersendiri.
Inheritance membentuk hubungan "adalah". class Dog yang memperluas Animal berarti seekor anjing adalah hewan. class anak mewarisi identitas induknya dan dapat digunakan di mana pun tipe induknya diharapkan.
Trait menyediakan kemampuan "memiliki". Saat sebuah class menggunakan trait Loggable, class tersebut memiliki fungsi pencatatan log, tetapi tidak berubah menjadi logger. Trait menambahkan perilaku tanpa mengubah hakikat class tersebut.
<?php
// Pewarisan: Dog ADALAH Animal
class Animal {
public function breathe(): void {
echo "Breathing";
}
}
class Dog extends Animal {
public function bark(): void {
echo "Woof!";
}
}
// Trait: Dog MEMILIKI kemampuan mencatat log
trait Loggable {
public function log(string $msg): void {
echo "Log: $msg";
}
}
class Cat extends Animal {
use Loggable;
}
Perbedaan utama yang perlu diingat:
| Aspek | Inheritance | Traits |
|---|---|---|
| Hubungan | adalah | memiliki kemampuan |
| Batasan | Hanya satu parent | Beberapa traits diperbolehkan |
| Pemeriksaan tipe | Bekerja dengan instanceof | Tidak memiliki identitas tipe |
| Paling cocok untuk | Hubungan hierarkis | Perilaku bersama di antara class yang tidak berkaitan |
Gunakan inheritance saat beberapa class memiliki identitas yang sama. Gunakan trait saat class yang tidak berkaitan membutuhkan fungsionalitas yang sama tanpa menjadi bagian dari silsilah yang sama.
Tantangan
MudahMari buat sistem kendaraan yang menunjukkan kapan harus menggunakan pewarisan dibandingkan trait. Kamu akan membuat hierarki kendaraan yang berbagi identitas umum melalui pewarisan, sambil menambahkan kemampuan lintas fungsi melalui trait.
Kamu akan mengatur kodemu dalam empat file:
Trackable.php: Buat trait bernamaTrackableyang menyediakan kemampuan pelacakan GPS. Trait ini harus memiliki:- Property privat
$location(string) - Method
setLocation(string $location)yang menyimpan lokasi saat ini - Method
getLocation()yang mengembalikan"Location: [location]"
- Property privat
Vehicle.php: Buat class dasarVehicleyang menetapkan hubungan "adalah". Sertakan file trait. Gunakan promosi konstruktor untuk mendefinisikan property$brandyang dilindungi. Tambahkan methoddescribe()yang mengembalikan"Vehicle: [brand]". Class ini harus menggunakan traitTrackablekarena semua kendaraan dalam armada kita akan memiliki GPS.Car.php: Buat classCaryang mewarisiVehicle. Sertakan file Vehicle. Gunakan promosi konstruktor untuk menerima merek dan property privat$doors(integer). Panggil konstruktor induk dengan merek tersebut. Ganti methoddescribe()agar mengembalikan"Car: [brand] with [doors] doors".main.php: Sertakan file Car. Kamu akan menerima tiga input: nama merek, jumlah pintu, dan string lokasi. Buat instanceCar, tetapkan lokasinya, lalu cetak dua baris:- Hasil pemanggilan
describe() - Hasil pemanggilan
getLocation()
- Hasil pemanggilan
Perhatikan cara pewarisan dan trait bekerja bersama di sini: Car adalah Vehicle (pewarisan menetapkan identitas), sementara Vehicle memiliki kemampuan pelacakan (trait menambahkan perilaku). Kamu bisa menggunakan instanceof Vehicle untuk memeriksa apakah sesuatu adalah kendaraan, tetapi tidak ada tipe "Trackable" untuk diperiksa: itulah perbedaan utama antara kedua pendekatan ini.
Coba sendiri
<?php
// File utama: buat dan uji instance Car
// TODO: Sertakan file Car.php
// Baca input
$brand = trim(fgets(STDIN));
$doors = intval(trim(fgets(STDIN)));
$location = trim(fgets(STDIN));
// TODO: Buat instance Car dengan brand dan doors
// TODO: Atur lokasi mobil
// TODO: Cetak hasil describe()
// TODO: Cetak hasil getLocation()
?>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 Pembayaran9Trait
Pengantar TraitMenggunakan Beberapa TraitResolusi Konflik TraitMetode Abstrak dalam TraitTrait vs PewarisanLatihan sendiri: Compiler PHP online