Menu
CoddyTech

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:00

class 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.

challenge icon

Tantangan

Mudah

Mari 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 bernama Priceable yang 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
  • Stockable.php: Buat trait bernama Stockable yang 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 mengembalikan true jika stok lebih besar dari 0, atau false jika tidak
  • main.php: Sertakan kedua file trait dan buat class Product yang menggunakan trait Priceable dan Stockable. 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
?>
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