Menu
CoddyTech

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:

AspekInheritanceTraits
Hubunganadalahmemiliki kemampuan
BatasanHanya satu parentBeberapa traits diperbolehkan
Pemeriksaan tipeBekerja dengan instanceofTidak memiliki identitas tipe
Paling cocok untukHubungan hierarkisPerilaku 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.

challenge icon

Tantangan

Mudah

Mari 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 bernama Trackable yang 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]"
    Trait ini mewakili kemampuan "memiliki": kendaraan apa pun bisa memiliki pelacakan, tetapi memiliki pelacakan tidak menjadikan sesuatu sebagai kendaraan.
  • Vehicle.php: Buat class dasar Vehicle yang menetapkan hubungan "adalah". Sertakan file trait. Gunakan promosi konstruktor untuk mendefinisikan property $brand yang dilindungi. Tambahkan method describe() yang mengembalikan "Vehicle: [brand]". Class ini harus menggunakan trait Trackable karena semua kendaraan dalam armada kita akan memiliki GPS.
  • Car.php: Buat class Car yang mewarisi Vehicle. Sertakan file Vehicle. Gunakan promosi konstruktor untuk menerima merek dan property privat $doors (integer). Panggil konstruktor induk dengan merek tersebut. Ganti method describe() 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 instance Car, tetapkan lokasinya, lalu cetak dua baris:
    • Hasil pemanggilan describe()
    • Hasil pemanggilan getLocation()

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