Menu
Coddy logo textTech

Metot Geçersiz Kılma

Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 23 / 91.

Bazen bir üst sınıftan devralınan yöntem, alt sınıfın ihtiyaçlarına tam olarak uymaz. Yöntem geçersiz kılma, alt sınıfın üst sınıfta zaten var olan bir yönteme kendi uygulamasını sağlamasına olanak tanır.

Bir yöntemi geçersiz kılmak için alt sınıfta, üst sınıfın yöntemiyle aynı ada sahip bir yöntem tanımlaman yeterlidir:

<?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();

Çıktı:

Whiskers says meow

Cat sınıfı, üst sınıfın speak() yöntemini tamamen kendi sürümüyle değiştirir. Bir kedi nesnesi üzerinde speak() çağırdığında, PHP alt sınıfın uygulamasını kullanır.

Ayrıca parent:: ifadesini kendi mantığınızla birleştirerek üst sınıfın davranışını genişletebilirsiniz:

<?php
class Dog extends Animal {
    public function speak() {
        return parent::speak() . " - woof woof!";
    }
}

$dog = new Dog("Rex");
echo $dog->speak();

Çıktı:

Rex makes a sound - woof woof!

Temel Nokta: Metot geçersiz kılma, alt sınıfların devralınan davranışı özelleştirmesine olanak tanır. Bir metodu tamamen değiştirebilir veya özgün uygulamanın üzerine ekleme yapmak için parent:: kullanabilirsin.

challenge icon

Görev

Kolay

Alt sınıfların, yöntem geçersiz kılma yoluyla üst sınıf yöntemlerini tamamen değiştirebildiğini veya genişletebildiğini gösteren bir bildirim sistemi oluşturalım.

Farklı bildirim türlerini göndermek için birlikte çalışan ve her biri kendine özgü davranışa sahip üç dosya oluşturacaksın:

  • Notification.php: Tüm bildirim türleri için temel görevi gören bir Notification sınıfı tanımla. Bu sınıfın herkese açık bir $recipient özelliği ve alıcıyı kabul edip ayarlayan bir oluşturucusu olmalı. "Sending to [recipient]: [message]" değerini döndüren bir send($message) yöntemi ekle.
  • UrgentNotification.php: Notification sınıfını genişleten bir UrgentNotification sınıfı tanımla. En üstte Notification dosyasını dahil et. Bu sınıf, "URGENT to [recipient]: [message]!!!" değerini döndürmek üzere send($message) yöntemini tamamen geçersiz kılmalı: "URGENT" ön ekine ve sondaki ünlem işaretlerine dikkat et. Bu, üst sınıfın davranışını tamamen değiştirmeyi gösterir.
  • LoggedNotification.php: Notification sınıfını genişleten bir LoggedNotification sınıfı tanımla. En üstte Notification dosyasını dahil et. Bu sınıf, send($message) yöntemini geçersiz kılmalı ancak üst sınıfın uygulamasını temel almalı: parent::send($message) çağrısını yap ve sonuca " [logged]" ekle. Bu, davranışı değiştirmek yerine genişletmeyi gösterir.

main.php içinde üç bildirim sınıfı dosyasını da dahil et. İki girdi alacaksın: alıcının adı ve gönderilecek mesaj. Aynı alıcıyı kullanarak her bildirim türünden bir örnek oluştur, ardından her biri üzerinde mesajla birlikte send() çağrısını yap. Her sonucu kendi satırında şu sırayla yazdır: normal bildirim, acil bildirim, ardından günlük kaydı tutulan bildirim.

Bu görev, yöntem geçersiz kılmaya yönelik her iki yaklaşımı da gösterir: UrgentNotification, üst sınıfın mantığını kendi biçimlendirmesiyle tamamen değiştirirken LoggedNotification, özgün davranışı korumak ve buna ekleme yapmak için parent:: kullanır.

Kendin dene

<?php

require_once 'Notification.php';
require_once 'UrgentNotification.php';
require_once 'LoggedNotification.php';

// Girdiyi oku
$recipient = trim(fgets(STDIN));
$message = trim(fgets(STDIN));

// TODO: Her bildirim türünden bir örnek oluştur (hepsi aynı alıcıyı kullanarak)

// TODO: Her bildirimde mesaj ile send() çağır
// Her sonucu kendi satırında şu sırayla yazdır:
// 1. Normal bildirim
// 2. Acil bildirim
// 3. Loglanmış bildirim

?>
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online PHP derleyicisi