oopinterfacetraitabstractMahir4 mnt baca

Interface, Abstract Class, dan Trait

Tiga alat OOP lanjutan: kontrak dengan interface, kerangka dengan abstract class, dan tempelan kode dengan trait.

Interface: kontrak yang wajib dipenuhi

Interface hanya berisi tanda tangan method tanpa isi. Class yang mengimplementasikannya wajib menyediakan semua method tersebut:

php
<?php
interface BisaTerbang {
    public function terbang(): string;
}

class Burung implements BisaTerbang {
    public function terbang(): string {
        return "Mengepakkan sayap...";
    }
}

class Pesawat implements BisaTerbang {
    public function terbang(): string {
        return "Menyalakan mesin jet...";
    }
}

Satu class boleh implements banyak interface sekaligus. Ini cara PHP meniru multiple inheritance secara aman.

Abstract class: kerangka setengah jadi

php
<?php
abstract class Bentuk {
    abstract public function luas(): float; // wajib diisi child

    public function deskripsi(): string { // sudah ada isi, boleh dipakai langsung
        return "Ini sebuah bentuk dengan luas " . $this->luas();
    }
}

class Persegi extends Bentuk {
    public function __construct(private float $sisi) {}

    public function luas(): float {
        return $this->sisi * $this->sisi;
    }
}

Abstract class tidak bisa di-instansiasi langsung (new Bentuk() error), hanya bisa diwarisi.

Trait: tempelan kode reusable

php
<?php
trait PunyaTimestamp {
    public string $dibuatPada;

    public function tandaiDibuat(): void {
        $this->dibuatPada = date("Y-m-d H:i:s");
    }
}

class Artikel {
    use PunyaTimestamp;
    public string $judul;
}

class Komentar {
    use PunyaTimestamp;
    public string $isi;
}

$a = new Artikel();
$a->tandaiDibuat(); // method dari trait langsung tersedia

Kapan pakai apa?

  • Interface: butuh jaminan "class ini pasti bisa X" (misalnya semua payment gateway pasti punya bayar()).
  • Abstract class: butuh kerangka dasar plus kode bawaan yang dipakai bersama.
  • Trait: butuh menempel kemampuan yang sama ke class-class yang tidak berhubungan.

Catatan teknis: Jangan over-engineering: tidak semua kode butuh interface dan trait. Mulailah dari class biasa, dan baru cabut jadi interface/trait saat kamu benar-benar punya dua class atau lebih yang butuh kontrak atau kode yang sama. Abstraksi yang dibuat terlalu dini justru menyulitkan dibaca.