Meninjau Kembali Method Overriding
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan PHP di Coddy. Pelajaran 33 dari 91.
Kamu sudah mempelajari method overriding di bab Inheritance. Sekarang, mari kita pelajari hubungannya dengan polimorfisme, salah satu konsep paling ampuh dalam pemrograman berorientasi objek.
Polimorfisme berarti "banyak bentuk." Saat kamu mengganti method di child class, kamu memberi method tersebut bentuk yang berbeda dengan tetap mempertahankan nama yang sama. Keajaibannya terjadi saat kamu bekerja dengan object melalui tipe induknya:
<?php
class Animal {
public function speak() {
return "Some sound";
}
}
class Dog extends Animal {
public function speak() {
return "Woof!";
}
}
class Cat extends Animal {
public function speak() {
return "Meow!";
}
}
function makeAnimalSpeak(Animal $animal) {
return $animal->speak();
}
echo makeAnimalSpeak(new Dog()) . "\n";
echo makeAnimalSpeak(new Cat());
Output:
Woof!
Meow!Fungsi makeAnimalSpeak() menerima Animal apa pun. Fungsi ini tidak tahu atau peduli apakah yang diterimanya Dog atau Cat. PHP secara otomatis memanggil method yang sudah di-override dengan benar berdasarkan tipe object yang sebenarnya saat program dijalankan.
Inilah polimorfisme dalam aksi.
Pendekatan ini memungkinkan kamu menulis kode fleksibel yang bekerja dengan sekumpulan object terkait tanpa mengetahui tipe spesifiknya. Kamu dapat menambahkan class hewan baru nanti, dan fungsi ini akan bekerja dengannya secara otomatis.
Poin Penting: Method overriding memungkinkan polimorfisme dengan membuat class yang berbeda merespons pemanggilan method yang sama secara berbeda, ditentukan saat program berjalan berdasarkan tipe object sebenarnya.
Tantangan
MudahMari buat sistem alat musik yang menunjukkan polimorfisme melalui penimpaan method. Kamu akan membuat class dasar Instrument dan dua class turunan yang masing-masing menghasilkan suara unik, lalu menggunakan satu fungsi untuk memainkan alat musik apa pun secara polimorfik.
Kamu akan menyusun kodemu dalam empat file:
Instrument.php: Buat classInstrumentdengan property$nameyang dilindungi dan diatur melalui konstruktor. Tambahkan methodplay()yang mengembalikan"[name] makes a sound". Ini menjadi perilaku dasar yang akan ditimpa oleh class turunan.Guitar.php: Buat classGuitaryang mewarisiInstrument. Sertakan file induknya. Konstruktor menerima nama dan meneruskannya ke konstruktor induk. Timpa methodplay()agar mengembalikan"[name] strums a chord".Drum.php: Buat classDrumyang mewarisiInstrument. Sertakan file induknya. Konstruktor menerima nama dan meneruskannya ke konstruktor induk. Timpa methodplay()agar mengembalikan"[name] beats a rhythm".main.php: Sertakan file Guitar dan Drum. Buat fungsi bernamaperformWithyang menerima parameterInstrument(dengan petunjuk tipe) dan mengembalikan hasil pemanggilanplay()padanya. Fungsi ini menunjukkan polimorfisme. Fungsi ini dapat digunakan dengan tipe alat musik apa pun melalui petunjuk tipe class induk.
Kamu akan menerima dua input: nama gitar dan nama drum. Buat Guitar dan Drum dengan nama-nama tersebut. Berikan masing-masing ke fungsi performWith(), lalu cetak hasilnya: gitar terlebih dahulu, kemudian drum, masing-masing pada barisnya sendiri.
Perhatikan bahwa performWith() menerima Instrument apa pun, tetapi PHP secara otomatis memanggil method play() yang ditimpa dengan benar berdasarkan tipe object sebenarnya saat program dijalankan. Itulah polimorfisme yang sedang bekerja!
Coba sendiri
<?php
// Sertakan file instrumen
require_once 'Guitar.php';
require_once 'Drum.php';
// Baca input
$guitarName = trim(fgets(STDIN));
$drumName = trim(fgets(STDIN));
// TODO: Buat fungsi bernama performWith yang:
// - Menerima parameter Instrument (gunakan petunjuk tipe: Instrument $instrument)
// - Mengembalikan hasil pemanggilan play() pada instrumen
// TODO: Buat Guitar dengan $guitarName dan Drum dengan $drumName
// TODO: Berikan keduanya ke performWith() dan cetak hasilnya (gitar lebih dulu, lalu drum)
?>Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengenalan OOPclass vs objectKata Kunci $thismethodpropertyConstructor (__construct)Destructor (__destruct)Ringkasan: Kalkulator Sederhana4Pewarisan
Pewarisan DasarKata Kunci parent::Penimpaan methodKata Kunci finalClass AbstrakRingkasan: Hierarki Karyawan7Enkapsulasi
Public, Protected, PrivateModifier Akses secara MendalamGetter dan SetterPenyembunyian InformasiPromosi Constructor (8.0)Ulasan: Sistem Catatan Siswa2Namespace dan Autoloading
Pengenalan NamespaceKata Kunci useStandar Autoloading PSR-4Autoloader ComposerRingkasan: Proyek yang Terorganisasi5Interface dan Kontrak
Pengenalan InterfaceMengimplementasikan InterfaceImplementasi Beberapa InterfaceInterface vs Abstract ClassPetunjuk Tipe dengan InterfaceRekap: Kalkulator Bentuk8Magic Methods
Pengantar Magic Methods__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Cloning Object__serialize & __unserializeRingkasan: Koleksi Kustom11Sistem Tipe Data dan Penanganan Error
Deklarasi TipeTipe NullableTipe Union dan IntersectionClass ExceptionHierarki Exception KustomTry, Catch, FinallyRekap: Validator Form3Property dalam class
Property instance vs staticKonstanta dalam classMethod & property staticProperty private & protectedProperty readonly (PHP 8.1)Ulasan: Pengelola Rekening Bank6Polimorfisme
Meninjau Kembali Method OverridingPolimorfisme melalui AntarmukaPetunjuk Tipe dan Tipe UnionPengikatan Statis TertundaRangkuman: Pemroses PembayaranLatihan sendiri: Compiler PHP online