Penimpaan method
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan PHP di Coddy. Pelajaran 23 dari 91.
Terkadang, method yang diwarisi dari class induk kurang sesuai dengan kebutuhan class anak. Method overriding memungkinkan class anak menyediakan implementasinya sendiri untuk method yang sudah ada di class induk.
Untuk menimpa method, cukup definisikan method di class anak dengan nama yang sama seperti method milik class induk:
<?php
class Animal {
public $name;
public function __construct($name) {
$this->name = $name;
}
public function speak() {
return "$this->name makes a sound";
}
}
class Cat extends Animal {
public function speak() {
return "$this->name says meow";
}
}
$cat = new Cat("Whiskers");
echo $cat->speak();
Keluaran:
Whiskers says meowclass Cat sepenuhnya menggantikan method speak() milik induknya dengan versinya sendiri. Saat kamu memanggil speak() pada object kucing, PHP menggunakan implementasi milik anaknya.
Kamu juga bisa memperluas perilaku class induk dengan menggabungkan parent:: dengan logikamu sendiri:
<?php
class Dog extends Animal {
public function speak() {
return parent::speak() . " - woof woof!";
}
}
$dog = new Dog("Rex");
echo $dog->speak();
Output:
Rex makes a sound - woof woof!Poin Penting: Method overriding memungkinkan class turunan menyesuaikan perilaku yang diwarisi. Kamu bisa mengganti method sepenuhnya atau menggunakan parent:: untuk mengembangkan implementasi aslinya.
Tantangan
MudahMari buat sistem notifikasi yang menunjukkan cara class turunan dapat sepenuhnya mengganti atau memperluas method parent melalui overriding method.
Kamu akan membuat tiga file yang bekerja sama untuk mengirim berbagai jenis notifikasi, masing-masing dengan perilaku uniknya sendiri:
Notification.php: Definisikan classNotificationyang menjadi dasar bagi semua jenis notifikasi. Class ini harus memiliki property publik$recipientdan constructor yang menerima serta menetapkan recipient. Sertakan methodsend($message)yang mengembalikan"Sending to [recipient]: [message]".UrgentNotification.php: Definisikan classUrgentNotificationyang mewarisiNotification. Sertakan file Notification di bagian atas. Class ini harus sepenuhnya meng-override methodsend($message)agar mengembalikan"URGENT to [recipient]: [message]!!!": perhatikan awalan "URGENT" dan tanda seru di bagian akhir. Ini menunjukkan penggantian sepenuhnya terhadap perilaku parent.LoggedNotification.php: Definisikan classLoggedNotificationyang mewarisiNotification. Sertakan file Notification di bagian atas. Class ini harus meng-overridesend($message), tetapi tetap menggunakan implementasi parent sebagai dasar: panggilparent::send($message)lalu tambahkan" [logged]"ke hasilnya. Ini menunjukkan cara memperluas perilaku, bukan menggantinya.
Di main.php, sertakan ketiga file class notifikasi. Kamu akan menerima dua input: nama penerima dan pesan yang akan dikirim. Buat satu instance untuk setiap jenis notifikasi, semuanya menggunakan penerima yang sama, lalu panggil send() dengan pesan pada masing-masing instance. Cetak setiap hasil pada barisnya sendiri dengan urutan berikut: notifikasi biasa, notifikasi mendesak, lalu notifikasi yang dicatat.
Tantangan ini menunjukkan dua pendekatan untuk overriding method: UrgentNotification sepenuhnya mengganti logika parent dengan formatnya sendiri, sedangkan LoggedNotification menggunakan parent:: untuk mempertahankan perilaku asli dan menambahkan sesuatu padanya.
Coba sendiri
<?php
require_once 'Notification.php';
require_once 'UrgentNotification.php';
require_once 'LoggedNotification.php';
// Baca input
$recipient = trim(fgets(STDIN));
$message = trim(fgets(STDIN));
// TODO: Buat satu instance untuk setiap jenis notifikasi (semuanya menggunakan penerima yang sama)
// TODO: Panggil send() dengan pesan pada setiap notifikasi
// Cetak setiap hasil pada baris tersendiri dengan urutan berikut:
// 1. Notifikasi biasa
// 2. Notifikasi mendesak
// 3. Notifikasi yang dicatat
?>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