Di PHP sebuah class mewarisi class lain dengan extends: class Dog extends Animal memberi Dog setiap property dan method public serta protected milik Animal. Child class bisa menambahkan method baru, meng-override method yang diwarisi dengan mendeklarasikan method bernama sama, dan memanggil versi aslinya dengan parent::method().
Dog tidak punya constructor, jadi ia memakai constructor milik Animal, itulah sebabnya new Dog('Rex') berfungsi. Sebuah child class hanya bisa meng-extend satu parent; PHP tidak punya multiple inheritance untuk class.
Memanggil method parent dengan parent::
Override mengganti method parent sepenuhnya. Untuk memperluasnya alih-alih menggantinya, panggil parent::method() dari child lalu kembangkan hasilnya:
Hal yang sama berlaku untuk constructor dengan parent::__construct(...), yang dibahas di halaman constructor, termasuk apa yang terjadi kalau kamu lupa menulisnya.
protected vs private di child class
Member protected tersembunyi dari kode luar tetapi terlihat oleh setiap class dalam satu keluarga. Member private hanya terlihat di class yang mendeklarasikannya, jadi child class sama sekali tidak bisa melihatnya:
isset($this->pin) bernilai false di child karena child tidak punya akses ke $pin private milik parent, sedangkan method milik parent sendiri, hasPin(), tetap bisa membacanya. Pakai protected untuk hal yang memang dimaksudkan sebagai dasar bagi subclass, dan private untuk detail yang ingin tetap bebas kamu ubah.
Polimorfisme dan instanceof
Kode yang ditulis untuk tipe parent bekerja dengan setiap child. Setiap object menjalankan versinya sendiri dari method yang di-override, jadi satu loop bisa menangani semuanya. instanceof memeriksa apakah sebuah object berasal dari suatu class atau salah satu turunannya:
Jika parent tidak pernah dimaksudkan untuk dipakai sendirian (Shape biasa dengan luas 0 kurang masuk akal), jadikan sebagai abstract class dan deklarasikan area() sebagai abstract.
Aturan override: signature harus tetap kompatibel
Method yang meng-override harus menerima setidaknya apa yang diterima parent dan mengembalikan sesuatu yang bisa dipakai oleh pemanggil parent. Kamu boleh menambahkan parameter opsional, memperluas tipe parameter, atau mempersempit tipe return; kamu tidak boleh menambahkan parameter wajib atau menjadikan method public menjadi private.
Ubah string $sep = ',' menjadi string $sep yang wajib, maka PHP menolak mengompilasi class itu dengan fatal error ("Declaration of CsvExporter::export(array sep): string must be compatible with Exporter::export(array $rows): string").
Class dan method final
final menghentikan pewarisan di titik itu. Method final tidak bisa di-override, dan final class tidak bisa di-extend. Keduanya diperiksa saat file dikompilasi, jadi script sama sekali tidak dimulai:
<?php
class Payment
{
final public function charge(int $cents): string
{
return "charged $cents";
}
}
class FreePayment extends Payment
{
public function charge(int $cents): string
{
return 'free';
}
}
PHP Fatal error: Cannot override final method Payment::charge() in /home/index.php on line 12
Untuk class final, pesannya adalah Class B cannot extend final class A. Tandai sebuah method sebagai final saat parent bergantung pada perilakunya yang harus persis satu cara, misalnya method yang memeriksa izin sebelum melakukan hal lain.
Jebakan method private
Method private tidak diwariskan, jadi method child dengan nama yang sama tidak meng-override-nya. Kode di parent tetap memanggil versi private miliknya sendiri, yang mengejutkan orang yang mengira method child yang akan berjalan:
greet() tetap mencetak Hello: $this->word() di parent mengarah ke method private milik parent. Ubah private menjadi protected di Greeter lalu jalankan lagi; sekarang method child benar-benar meng-override dan greet() mengucapkan Bonjour.
Pertanyaan yang sering diajukan
Bagaimana cara kerja extends di PHP?
class Dog extends Animal menjadikan Dog turunan dari Animal. Object Dog memiliki setiap property dan method public serta protected milik Animal, bisa menambahkan miliknya sendiri, dan bisa mengganti (override) method yang diwarisi dengan mendeklarasikan method bernama sama.
Bagaimana cara memanggil method parent di PHP?
Pakai parent::methodName() di dalam method milik child, misalnya return parent::describe() . ' and more';. Untuk constructor, tulis parent::__construct(...).
Apakah PHP mendukung multiple inheritance?
Tidak. Sebuah class hanya bisa meng-extend satu parent class. Untuk berbagi perilaku dari beberapa sumber, implementasikan beberapa interface (class A implements B, C) dan pakai trait (use Loggable, Timestamps;).
Apa arti final di PHP?
Method final tidak bisa di-override oleh child class, dan final class sama sekali tidak bisa di-extend. Melanggar salah satu aturan itu adalah fatal error saat class dikompilasi, misalnya Cannot override final method A::f().
Bisakah child class mengakses property private milik parent-nya di PHP?
Tidak. Member private hanya milik class yang mendeklarasikannya, jadi di child $this->pin adalah property yang tidak terdefinisi (warning, lalu null) dan method child dengan nama yang sama tidak meng-override method private. Deklarasikan member itu sebagai protected jika child class membutuhkannya.