Selamat datang di Part 50 dari seri tutorial pemrograman PHP 'Zero to Hero'! Di part ini, kita akan mempelajari tentang PHP Traits. Traits memungkinkan kita untuk menggunakan kembali blok kode dalam beberapa kelas tanpa perlu menggunakan pewarisan berganda, yang tidak didukung langsung oleh PHP. Sebelum memulai, pastikan Anda sudah memahami konsep dasar kelas dan pewarisan di PHP. Jika belum, silakan lihat kembali tutorial-tutorial sebelumnya.
Sebagai lanjutan dari part sebelumnya tentang PHP Reflection - Membongkar Rahasia Kelas dan Objek, traits memberikan kita mekanisme lebih lanjut dalam mengatur dan memanipulasi behavior dari class.
Bayangkan Anda memiliki beberapa kelas yang berbeda yang memerlukan fungsi yang sama. Dengan pewarisan, Anda mungkin tergoda untuk membuat kelas dasar yang berisi fungsi tersebut. Namun, jika kelas-kelas tersebut tidak memiliki hubungan 'is-a' yang logis, pewarisan menjadi tidak tepat. Traits hadir sebagai solusi. Traits adalah blok kode reusable yang dapat di-inject ke dalam beberapa kelas. Traits mirip seperti 'mix-in' atau 'role' dalam bahasa pemrograman lain.
Analogi Dunia Nyata: Anggap saja Anda memiliki beberapa jenis robot: robot pembersih, robot memasak, dan robot pengasuh anak. Semuanya membutuhkan kemampuan untuk 'bergerak'. Kita tidak perlu membuat kelas 'Robot Bergerak' dan mewariskannya ke semua robot. Kita bisa membuat trait 'BisaBergerak' yang bisa di-inject ke setiap kelas robot sesuai kebutuhan.
<?php
// Mendefinisikan Trait
trait Logger {
public function log(string $message) {
echo date('Y-m-d H:i:s') . ': ' . $message . "\n";
}
}
// Kelas yang menggunakan Trait
class User {
use Logger;
public string $name;
public function __construct(string $name){
$this->name = $name;
}
public function createUser() {
$this->log("User {$this->name} created.");
}
}
class Product {
use Logger;
public string $name;
public function __construct(string $name){
$this->name = $name;
}
public function createProduct() {
$this->log("Product {$this->name} created.");
}
}
// Menggunakan Kelas
$user = new User("John Doe");
$user->createUser(); // Output: 2023-10-27 10:00:00: User John Doe created.
$product = new Product("Awesome Gadget");
$product->createProduct(); // Output: 2023-10-27 10:00:00: Product Awesome Gadget created.
?>
Penjelasan Kode:
trait Logger: Mendefinisikan trait bernama Logger.public function log(string $message): Fungsi di dalam trait yang mencatat pesan ke layar.use Logger: Menggunakan trait Logger di dalam kelas User dan Product.log().<?php
trait PriceFormatter {
public function formatPrice(float $price): string {
return '$' . number_format($price, 2);
}
}
trait DiscountApplicator {
public function applyDiscount(float $price, float $discount): float {
return $price * (1 - $discount);
}
}
class OnlineCourse {
use PriceFormatter, DiscountApplicator;
public string $name;
public float $price;
public function __construct(string $name, float $price){
$this->name = $name;
$this->price = $price;
}
public function getFinalPrice(float $discount): string {
$discountedPrice = $this->applyDiscount($this->price, $discount);
return $this->formatPrice($discountedPrice);
}
}
$course = new OnlineCourse("PHP Masterclass", 99.99);
echo $course->getFinalPrice(0.2); // Output: $79.99
?>
Penjelasan Kode:
trait PriceFormatter dan trait DiscountApplicator: Mendefinisikan dua trait yang berbeda.use PriceFormatter, DiscountApplicator: Menggunakan kedua trait di dalam kelas OnlineCourse.OnlineCourse sekarang memiliki fungsi untuk memformat harga dan menerapkan diskon.insteadof dan as.Buatlah sebuah trait bernama `Auditable` yang memiliki fungsi `recordActivity(string $activity)`. Gunakan trait ini di beberapa kelas (misalnya `BlogPost` dan `Comment`) dan implementasikan fungsi `recordActivity()` untuk mencatat aktivitas ke database (Anda bisa menggunakan simulasi dengan mencetak ke layar).