Menu

Interface PHP: implements, Konstanta, dan Contoh

Interface PHP mendaftar method yang dijanjikan sebuah class: interface Shape { public function area(): float; }, lalu class Circle implements Shape wajib mendefinisikan area(). Pelajari type hint dengan interface, mengimplementasikan beberapa interface, konstanta interface, interface yang meng-extend interface lain, interface bawaan seperti Countable, dan interface vs abstract class.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

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:

InterfaceAbstract class
Body methodtidak ada (hanya signature)method abstract dan method yang sudah jadi
Propertytidakya
Constructorbisa dideklarasikan, jarang bergunaya, dengan kode
Visibilitas methodhanya publicpublic, protected, private
Konstantayaya
Berapa banyak per classberapa pun (implements A, B, C)satu (extends Base)
Pemakaian umumsebuah kemampuan: Exportable, Countablekode 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.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai