Menu
CoddyTech

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 meow

class 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.

challenge icon

Tantangan

Mudah

Mari 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 class Notification yang menjadi dasar bagi semua jenis notifikasi. Class ini harus memiliki property publik $recipient dan constructor yang menerima serta menetapkan recipient. Sertakan method send($message) yang mengembalikan "Sending to [recipient]: [message]".
  • UrgentNotification.php: Definisikan class UrgentNotification yang mewarisi Notification. Sertakan file Notification di bagian atas. Class ini harus sepenuhnya meng-override method send($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 class LoggedNotification yang mewarisi Notification. Sertakan file Notification di bagian atas. Class ini harus meng-override send($message), tetapi tetap menggunakan implementasi parent sebagai dasar: panggil parent::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

?>
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler PHP online