Metode Abstrak dalam Trait
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan PHP di Coddy. Pelajaran 54 dari 91.
Trait dapat menyediakan method yang siap digunakan, tetapi terkadang kamu perlu class yang menggunakan trait tersebut mengimplementasikan fungsi tertentu. Di sinilah method abstrak dalam trait berguna: method tersebut menetapkan kontrak yang harus dipenuhi oleh class yang menggunakannya.
Ketika sebuah trait mendeklarasikan method abstrak, setiap class yang menggunakan trait tersebut harus mengimplementasikannya:
<?php
trait Notifiable {
abstract public function getEmail(): string;
public function sendNotification(string $message): void {
echo "Sending to " . $this->getEmail() . ": $message";
}
}
class User {
use Notifiable;
public function __construct(private string $email) {}
public function getEmail(): string {
return $this->email;
}
}
$user = new User("john@example.com");
$user->sendNotification("Welcome!");
Output:
Sending to john@example.com: Welcome!Trait menyediakan method sendNotification(), tetapi bergantung pada getEmail() yang harus diimplementasikan oleh class. Ini menciptakan pola yang ampuh, yaitu trait menangani logika umum sementara detail khusus class diserahkan kepada class yang mengimplementasikannya.
Jika sebuah class menggunakan trait tanpa mengimplementasikan method abstrak, PHP akan menimbulkan error fatal. Ini memastikan trait dapat mengandalkan keberadaan method tertentu dengan aman, sehingga kodemu lebih mudah diprediksi dan dipelihara.
Tantangan
MudahMari kita buat sistem penetapan harga yang menghitung harga akhir berbagai jenis produk dengan cara berbeda, tetapi semuanya menggunakan logika diskon yang sama melalui trait dengan method abstrak.
Kamu akan mengatur kodemu dalam tiga file:
Discountable.php: Buat trait bernamaDiscountableyang menyediakan fungsionalitas diskon. Trait ini harus memiliki:- Method abstrak
getBasePrice(): floatyang harus diimplementasikan oleh class yang menggunakan trait ini - Method
applyDiscount(int $percent)yang menghitung dan mengembalikan harga setelah persentase diskon diterapkan pada harga dasar - Method
getFinalPrice(int $percent)yang mengembalikan string dengan format:"Final price: $[discounted_price]"dengan 2 angka desimal
- Method abstrak
Product.php: Buat classProductyang menggunakan traitDiscountable. Sertakan file trait tersebut. Gunakan promosi konstruktor untuk mendefinisikan$nameprivat bertipe string dan$priceprivat bertipe float. Implementasikan methodgetBasePrice()yang diwajibkan untuk mengembalikan harga produk.main.php: Sertakan file Product. Kamu akan menerima tiga input: nama produk, harga, dan persentase diskon. Buat sebuah instanceProductdan cetak dua baris:- Harga dasar dengan format
"Base: $[price]"dan 2 angka desimal - Hasil pemanggilan
getFinalPrice()dengan persentase diskon
- Harga dasar dengan format
Pola ini berguna karena trait Discountable dapat digunakan oleh class apa pun, seperti produk, layanan, dan langganan, selama class tersebut mengimplementasikan getBasePrice(). Trait ini menyediakan logika diskon yang sama, sementara setiap class menentukan sumber harga dasarnya.
Coba sendiri
<?php
require_once 'Product.php';
// Baca input
$name = trim(fgets(STDIN));
$price = floatval(trim(fgets(STDIN)));
$discountPercent = intval(trim(fgets(STDIN)));
// TODO: Buat instance Product dengan nama dan harga
// TODO: Tampilkan harga dasar dengan format "Base: $[price]" dan 2 angka di belakang koma
// TODO: Tampilkan hasil pemanggilan getFinalPrice() dengan persentase diskon
?>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