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