Menggunakan Beberapa Trait
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan PHP di Coddy. Pelajaran 52 dari 91.
Satu trait berguna, tetapi kekuatan sebenarnya muncul saat kamu menggabungkan beberapa trait dalam satu class. PHP memungkinkan kamu menyertakan trait sebanyak yang kamu perlukan, sehingga class-mu memperoleh kemampuan dari beberapa sumber sekaligus.
Untuk menggunakan beberapa trait, cukup cantumkan semuanya dengan pemisah koma setelah kata kunci use:
<?php
trait Timestampable {
public function getTimestamp(): string {
return date('Y-m-d H:i:s');
}
}
trait Identifiable {
private string $id;
public function generateId(): void {
$this->id = uniqid('id_');
}
public function getId(): string {
return $this->id;
}
}
class Post {
use Timestampable, Identifiable;
public function __construct(public string $title) {
$this->generateId();
}
}
$post = new Post("Hello World");
echo $post->getId() . " - " . $post->getTimestamp();
Output:
id_6789abc123 - 2024-01-15 10:30:00class Post kini memiliki method dari kedua trait. Setiap trait menyumbangkan fungsionalitasnya sendiri: Timestampable menyediakan method terkait waktu, sedangkan Identifiable menangani ID unik. Pendekatan ini menjaga agar setiap trait berfokus pada satu tanggung jawab, sehingga kodemu lebih modular dan dapat digunakan kembali.
Apa yang terjadi ketika dua trait memiliki method dengan nama yang sama? Kita akan membahas situasi konflik ini di pelajaran berikutnya.
Tantangan
MudahMari kita buat sistem manajemen produk yang menggabungkan beberapa trait agar produk memiliki kemampuan penetapan harga dan pengelolaan inventaris. Setiap trait akan menangani satu tanggung jawab, dan class produkmu akan mendapatkan fungsionalitas dari keduanya.
Kamu akan mengatur kodemu dalam tiga file:
Priceable.php: Buat trait bernamaPriceableyang menangani fungsionalitas penetapan harga. Trait ini harus memiliki:- Property privat
$price(float) - Method
setPrice(float $price)yang menyimpan harga - Method
getPrice()yang mengembalikan harga - Method
getFormattedPrice()yang mengembalikan harga dengan format"$[price]"dan 2 angka desimal
- Property privat
Stockable.php: Buat trait bernamaStockableyang mengelola inventaris. Trait ini harus memiliki:- Property privat
$stock(integer) - Method
setStock(int $quantity)yang menyimpan jumlah stok - Method
getStock()yang mengembalikan stok saat ini - Method
isInStock()yang mengembalikantruejika stok lebih besar dari 0, ataufalsejika tidak
- Property privat
main.php: Sertakan kedua file trait dan buat classProductyang menggunakan traitPriceabledanStockable. Gunakan promosi constructor untuk mendefinisikan property publik$name. Constructor juga harus menerima harga dan jumlah stok, lalu menggunakan method dari trait untuk menetapkan nilainya.Kamu akan menerima tiga input: nama produk, harga, dan jumlah stok. Buat produk dengan nilai-nilai tersebut dan cetak empat baris:
- Nama produk
- Harga berformat (menggunakan
getFormattedPrice()) - Jumlah stok
"Available"jika stok tersedia, atau"Out of stock"jika tidak
Ini menunjukkan cara beberapa trait bekerja sama. Class Product-mu mendapatkan kemampuan penetapan harga dari satu trait dan pengelolaan inventaris dari trait lainnya. Setiap tanggung jawab tetap terpisah dengan rapi, sementara keduanya digabungkan menjadi produk dengan fitur lengkap.
Coba sendiri
<?php
require_once 'Priceable.php';
require_once 'Stockable.php';
// TODO: Buat class Product yang menggunakan trait Priceable dan Stockable
// Gunakan promosi konstruktor untuk property public $name
// Konstruktor harus menerima name, price, dan stock, lalu menggunakan method dari trait untuk mengatur price dan stock
class Product {
// TODO: Gunakan trait di sini
// TODO: Implementasikan konstruktor dengan promosi konstruktor untuk $name
// dan atur price serta stock menggunakan method dari trait
}
// Baca input
$name = trim(fgets(STDIN));
$price = floatval(trim(fgets(STDIN)));
$stock = intval(trim(fgets(STDIN)));
// TODO: Buat instance Product dengan nilai input
// TODO: Tampilkan nama produk
// TODO: Tampilkan harga yang diformat menggunakan getFormattedPrice()
// TODO: Tampilkan jumlah stok
// TODO: Tampilkan "Available" jika ada stok, atau "Out of stock" jika tidak
?>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