Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Mari 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 bernama Discountable yang menyediakan fungsionalitas diskon. Trait ini harus memiliki:
    • Method abstrak getBasePrice(): float yang 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
    Trait ini menangani semua perhitungan diskon, tetapi bergantung pada setiap class untuk menentukan harga dasarnya.
  • Product.php: Buat class Product yang menggunakan trait Discountable. Sertakan file trait tersebut. Gunakan promosi konstruktor untuk mendefinisikan $name privat bertipe string dan $price privat bertipe float. Implementasikan method getBasePrice() yang diwajibkan untuk mengembalikan harga produk.
  • main.php: Sertakan file Product. Kamu akan menerima tiga input: nama produk, harga, dan persentase diskon. Buat sebuah instance Product dan cetak dua baris:
    • Harga dasar dengan format "Base: $[price]" dan 2 angka desimal
    • Hasil pemanggilan getFinalPrice() dengan persentase diskon

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

?>
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