Kelas dan metode abstrak adalah ketika kelas induk memiliki metode bernama, tetapi membutuhkan kelas anaknya untuk mengisi tugas.
Kelas abstrak adalah kelas yang berisi setidaknya satu metode abstrak. Metode abstrak adalah metode yang dideklarasikan, tetapi tidak diimplementasikan dalam kode.
Kelas atau metode abstrak ditentukan dengan kata kunci abstract
:
Sintaks
<?php abstract class ParentClass { abstract public function someMethod1(); abstract public function someMethod2($name, $color); abstract public function someMethod3() : string; } ?>
Saat mewarisi dari kelas abstrak, metode kelas anak harus didefinisikan dengan nama yang sama dan pengubah akses yang sama atau kurang terbatas. Jadi, jika metode abstrak didefinisikan sebagai protected, metode kelas anak harus didefinisikan sebagai protected atau public, tetapi tidak private. Selain itu, jenis dan jumlah argumen yang diperlukan harus sama. Namun, kelas anak mungkin memiliki argumen opsional sebagai tambahan.
Jadi, ketika kelas anak diwarisi dari kelas abstrak, kita memiliki aturan berikut:
Mari kita lihat contohnya:
Contoh :
<?php // Parent class abstract class Car { public $name; public function __construct($name) { $this->name = $name; } abstract public function intro() : string; } // Child classes class Audi extends Car { public function intro() : string { return "Pilih kualitas jerman! Mobil $this->name!"; } } class Volvo extends Car { public function intro() : string { return "Bangga menjadi orang swedia! Mobil $this->name!"; } } class Citroen extends Car { public function intro() : string { return "Perancis yang pemborosan! Mobil $this->name!"; } } // Buat objek dari kelas anak $audi = new audi("Audi"); echo $audi->intro(); echo "<br>"; $volvo = new volvo("Volvo"); echo $volvo->intro(); echo "<br>"; $citroen = new citroen("Citroen"); echo $citroen->intro(); ?> /*Output Pilih kualitas Jerman! Saya seorang Audi! Bangga menjadi orang Swedia! Saya seorang Volvo! Pemborosan Prancis! Saya seorang Citroen! */
Penjelasan Kode
Kelas Audi, Volvo, dan Citroen diwarisi dari kelas Mobil. Hal ini berarti bahwa kelas Audi, Volvo, dan Citroen dapat menggunakan properti $name publik serta metode public __construct () dari kelas Mobil karena faktor pewarisan.
Tapi, intro() adalah metode abstrak yang harus didefinisikan di semua kelas anak dan mereka harus mengembalikan sebuah string.
Mari kita lihat contoh lain di mana metode abstrak memiliki argumen:
Contoh :
<?php abstract class ParentClass { // Abstract method with an argument abstract protected function prefixName($name); } class ChildClass extends ParentClass { public function prefixName($name) { if ($name == "John Doe") { $prefix = "Mr."; } elseif ($name == "Jane Doe") { $prefix = "Mrs."; } else { $prefix = ""; } return "{$prefix} {$name}"; } } $class = new ChildClass; echo $class->prefixName("John Doe"); echo "<br>"; echo $class->prefixName("Jane Doe"); ?> /*Output Mr. John Doe Mrs. Jane Doe */
Mari kita lihat contoh lain di mana metode abstrak memiliki argumen dan kelas anak memiliki dua argumen opsional yang tidak ditentukan dalam metode abstrak induknya:
Contoh :
<?php abstract class ParentClass { // Metode abstrak dengan argumen abstract protected function prefixName($name); } class ChildClass extends ParentClass { // Kelas anak dapat mendefinisikan argumen opsional yang tidak ada dalam metode abstrak induknya public function prefixName($name, $separator = ".", $greet = "Dear") { if ($name == "John Doe") { $prefix = "Mr"; } elseif ($name == "Jane Doe") { $prefix = "Mrs"; } else { $prefix = ""; } return "{$greet} {$prefix}{$separator} {$name}"; } } $class = new ChildClass; echo $class->prefixName("John Doe"); echo "<br>"; echo $class->prefixName("Jane Doe"); ?> /*Output Dear Mr. John Doe Dear Mrs. Jane Doe */