Selamat datang kembali di seri tutorial Tutorial Pemrograman! Di part sebelumnya, kita membahas PHP Reflection. Kali ini, kita akan menyelami topik yang sangat berguna: PHP Traits. Traits memungkinkan kita untuk menggunakan kembali kode dalam beberapa kelas secara independen, menghindari batasan pewarisan ganda (multiple inheritance) yang tidak didukung langsung oleh PHP. Prasyarat untuk tutorial ini adalah pemahaman dasar tentang konsep OOP di PHP, termasuk kelas, objek, dan inheritance.
Bayangkan Anda sedang membangun model Lego. Anda memiliki berbagai blok Lego yang masing-masing memiliki fungsi spesifik. Traits mirip dengan blok-blok Lego ini. Anda dapat menggabungkan beberapa traits ke dalam sebuah kelas untuk menambahkan fungsionalitas yang berbeda tanpa harus membuat kelas turunan yang kompleks. Traits adalah cara untuk mengelompokkan fungsionalitas dan menggunakannya kembali di beberapa kelas.
Traits memungkinkan implementasi metode, sedangkan Interfaces hanya mendefinisikan signature. Traits tidak memerlukan hierarki pewarisan seperti abstract class. Traits bisa disisipkan ke banyak class yang tidak berelasi.
Mari kita buat contoh sederhana:
<?php
// Definisikan trait Logging
trait Logging {
public function logMessage(string $message): void {
echo date('Y-m-d H:i:s') . ": " . $message . "\n";
}
}
// Kelas User menggunakan trait Logging
class User {
use Logging;
private string $username;
public function __construct(string $username) {
$this->username = $username;
}
public function register(): void {
$this->logMessage("User '{$this->username}' registered.");
}
}
// Kelas Product juga menggunakan trait Logging
class Product {
use Logging;
private string $name;
public function __construct(string $name) {
$this->name = $name;
}
public function save(): void {
$this->logMessage("Product '{$this->name}' saved.");
}
}
// Penggunaan
$user = new User('john_doe');
$user->register();
$product = new Product('Awesome Gadget');
$product->save();
?>
Penjelasan Kode:
Logging yang memiliki method logMessage.User dan Product menggunakan trait Logging dengan keyword use.User dan Product, sekarang memiliki method logMessage dari trait Logging.insteadof atau as.
<?php
trait TraitA {
public function sayHello() {
echo "Hello from TraitA!\n";
}
}
trait TraitB {
public function sayHello() {
echo "Hello from TraitB!\n";
}
}
class MyClass {
use TraitA, TraitB {
TraitA::sayHello insteadof TraitB; // Menggunakan sayHello dari TraitA
TraitB::sayHello as sayHelloFromB; // Membuat alias untuk sayHello dari TraitB
}
public function greet() {
$this->sayHello(); // Memanggil sayHello dari TraitA
$this->sayHelloFromB(); // Memanggil sayHello dari TraitB (melalui alias)
}
}
$obj = new MyClass();
$obj->greet();
?>
Buatlah sebuah trait bernama Discount yang menambahkan fungsionalitas diskon ke kelas Product. Trait ini harus memiliki method applyDiscount(float $percentage): float yang mengembalikan harga produk setelah diskon.