Interface PHP mendeklarasikan method yang dijanjikan akan disediakan sebuah class, tanpa kode apa pun: interface Shape { public function area(): float; }. Class yang menulis implements Shape wajib mendefinisikan area(), dan fungsi apa pun yang memakai type hint Shape akan menerima class itu.
describe() tidak tahu dan tidak peduli class mana yang diterimanya. Fungsi itu hanya mengandalkan janji yang dibuat interface, jadi Triangle implements Shape yang baru langsung bekerja dengannya tanpa mengubah satu baris pun.
Memprogram berdasarkan interface
Alasan umum menulis interface adalah agar kode bergantung pada sebuah kemampuan, bukan pada class tertentu. Di sini sebuah service pesanan menerima Notifier apa pun, jadi kode yang sama bisa mengirim email di production dan mengumpulkan pesan di pengujian:
Mengimplementasikan beberapa interface
Sebuah class meng-extend paling banyak satu parent, tetapi bisa mengimplementasikan interface sebanyak yang dibutuhkan. Tulis semuanya setelah implements, dipisahkan koma, lalu definisikan method dari semuanya:
JsonSerializable adalah salah satu interface bawaan PHP: mengimplementasikannya mengatur apa yang dihasilkan json_encode() untuk object tersebut.
Konstanta interface
Interface bisa mendeklarasikan konstanta. Setiap class yang mengimplementasikannya mewarisi konstanta itu, dan kamu bisa membacanya lewat nama interface atau nama class:
Interface tidak bisa punya property di PHP 8.3, hanya method dan konstanta. Method-nya boleh static: public static function fromArray(array $data): static; di interface mewajibkan setiap class mendefinisikan method static tersebut. Untuk sekumpulan nilai terkait yang tetap, enum sering lebih cocok daripada daftar konstanta interface.
Interface bisa meng-extend interface lain
Interface juga memakai extends, dan tidak seperti class, interface bisa meng-extend beberapa sekaligus. Class yang mengimplementasikan interface turunan itu wajib mendefinisikan method dari seluruh rantainya:
Interface bawaan: Countable, IteratorAggregate, Stringable
PHP menyediakan interface yang menghubungkan object dengan fitur bahasa. Countable membuat count($obj) berfungsi, IteratorAggregate membuat foreach berfungsi, dan Stringable diimplementasikan secara otomatis oleh class apa pun yang punya method __toString():
Lupa sebuah method
Jika sebuah class mengaku mengimplementasikan interface tetapi melewatkan sebuah method, PHP berhenti dengan fatal error yang menyebut nama method yang hilang:
Tambahkan method total() dan script-nya berjalan. Abstract class boleh membiarkan method interface tidak didefinisikan, dan itulah jalan keluar yang disarankan oleh pesan error-nya.
Interface vs abstract class
Keduanya mendefinisikan method yang wajib dimiliki sebuah class, dan keduanya bisa dipakai sebagai type hint. Perbedaannya ada pada apa lagi yang boleh dimuat dan berapa banyak yang bisa dipakai sebuah class:
| Interface | Abstract class | |
|---|---|---|
| Body method | tidak ada (hanya signature) | method abstract dan method yang sudah jadi |
| Property | tidak | ya |
| Constructor | bisa dideklarasikan, jarang berguna | ya, dengan kode |
| Visibilitas method | hanya public | public, protected, private |
| Konstanta | ya | ya |
| Berapa banyak per class | berapa pun (implements A, B, C) | satu (extends Base) |
| Pemakaian umum | sebuah kemampuan: Exportable, Countable | kode bersama untuk satu keluarga: Model, Controller |
Keduanya cocok dipadukan: definisikan interface untuk type hint, lalu sediakan abstract base class yang mengimplementasikannya dengan kode yang umum. Class yang membutuhkan base lain tetap bisa mengimplementasikan interface itu secara langsung.
Pertanyaan yang sering diajukan
Apa itu interface di PHP?
Daftar signature method public tanpa body: interface Logger { public function log(string $msg): void; }. Class yang menulis implements Logger wajib mendefinisikan setiap method di dalamnya, dan kode apa pun yang memakai type hint Logger menerima class itu.
Bisakah sebuah class PHP mengimplementasikan beberapa interface?
Bisa. Tulis semuanya setelah implements, dipisahkan koma: class File implements Readable, Writable, Countable. Class itu wajib mendefinisikan method dari semua interface tersebut. Dengan cara inilah PHP menangani apa yang dilakukan multiple inheritance di bahasa lain.
Apa perbedaan interface dan abstract class di PHP?
Interface hanya mendeklarasikan method public (dan konstanta); ia tidak punya property dan kode method, dan sebuah class bisa mengimplementasikan banyak interface. Abstract class bisa berisi property, constructor, dan method yang sudah jadi di samping method abstract-nya, tetapi sebuah class hanya bisa meng-extend satu. Pakai interface untuk sebuah kemampuan ("bisa diekspor"), dan abstract class untuk kode bersama dalam satu keluarga class.
Bisakah interface PHP punya property?
Tidak di PHP 8.3: interface boleh berisi signature method dan konstanta (const VERSION = 2;), tetapi tidak property. Deklarasi property di interface (property hooks) baru hadir di PHP 8.4.
Bagaimana cara mengecek apakah sebuah object mengimplementasikan interface di PHP?
Pakai instanceof: $obj instanceof Countable bernilai true jika class dari object itu mengimplementasikan interface tersebut, secara langsung maupun lewat parent class. class_implements($obj) mengembalikan nama semua interface yang diimplementasikan class itu.