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 miras alınan metot, alt sınıfın ihtiyaçlarına tam olarak uymaz. Metot geçersiz kılma (method overriding), bir alt sınıfın üst sınıfta zaten mevcut olan bir metodun kendi uygulamasını sağlamasına olanak tanır.

Bir metodu geçersiz kılmak (override etmek) için, alt sınıfta üst sınıfın metoduyla aynı ada sahip bir metot tanımlamanız 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ı, ebeveynin speak() metodunu tamamen kendi sürümüyle değiştirir. Bir kedi nesnesi üzerinde speak() metodunu çağırdığınızda, PHP alt sınıfın uygulamasını kullanır.

Ebeveynin davranışını, parent:: ifadesini kendi mantığınızla birleştirerek de 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!

Önemli Nokta: Metot geçersiz kılma (method overriding), alt sınıfların devralınan davranışı özelleştirmesine olanak tanır. Bir metodu tamamen değiştirebilir veya orijinal uygulama üzerine inşa etmek için parent:: kullanabilirsiniz.

challenge icon

Görev

Kolay

Alt sınıfların, metot geçersiz kılma (method overriding) yoluyla üst sınıf metotlarını nasıl tamamen değiştirebileceğini veya genişletebileceğ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ız:

  • Notification.php — Tüm bildirim türleri için temel teşkil eden bir Notification sınıfı tanımlayın. Bu sınıfın genel (public) bir $recipient özelliği ve alıcıyı kabul edip ayarlayan bir yapıcı metodu (constructor) olmalıdır. "Sending to [recipient]: [message]" değerini döndüren bir send($message) metodu ekleyin.
  • UrgentNotification.phpNotification sınıfını genişleten bir UrgentNotification sınıfı tanımlayın. Notification dosyasını en üste dahil edin. Bu sınıf, send($message) metodunu tamamen geçersiz kılarak "URGENT to [recipient]: [message]!!!" değerini döndürmelidir — "URGENT" önekine ve sondaki ünlem işaretlerine dikkat edin. Bu, üst sınıfın davranışının tamamen değiştirilmesini gösterir.
  • LoggedNotification.phpNotification sınıfını genişleten bir LoggedNotification sınıfı tanımlayın. Notification dosyasını en üste dahil edin. Bu sınıf send($message) metodunu geçersiz kılmalı ancak üst sınıfın uygulamasının üzerine inşa etmelidir: parent::send($message) metodunu çağırın ve sonuca " [logged]" ekleyin. Bu, davranışın değiştirilmesi yerine genişletilmesini gösterir.

main.php dosyasında, her üç bildirim sınıfı dosyasını da dahil edin. İki girdi alacaksınız: alıcı adı ve gönderilecek mesaj. Her bildirim türünden birer örnek oluşturun (hepsi aynı alıcıyı kullanarak), ardından her biri üzerinde mesajla birlikte send() metodunu çağırın. Her sonucu şu sırayla kendi satırında yazdırın: normal bildirim, acil bildirim ve ardından günlüklenmiş (logged) bildirim.

Bu meydan okuma, metot geçersiz kılmaya yönelik her iki yaklaşımı da göstermektedir — UrgentNotification üst sınıfın mantığını tamamen kendi biçimlendirmesiyle değiştirirken, LoggedNotification orijinal davranışı korumak ve üzerine ekleme yapmak için parent:: kullanır.

Kopya kağıdı

Metot geçersiz kılma (method overriding), bir alt sınıfın üst sınıftan miras alınan bir metodun kendi uygulamasını sağlamasına olanak tanır.

Bir metodu geçersiz kılmak için, alt sınıfta üst sınıfın metoduyla aynı ada sahip bir metot tanımlayın:

<?php
class Animal {
    public function speak() {
        return "makes a sound";
    }
}

class Cat extends Animal {
    public function speak() {
        return "says meow";
    }
}

Alt sınıf, üst sınıfın metot uygulamasını tamamen değiştirir. Bir alt sınıf nesnesi üzerinde çağrıldığında, PHP alt sınıfın sürümünü kullanır.

Üst sınıfın davranışını değiştirmek yerine genişletmek için, üst sınıf metodunu çağırmak ve kendi mantığınızı eklemek için parent:: kullanın:

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

Bu, üst sınıfın orijinal davranışını alt sınıftan gelen ek işlevlerle birleştirir.

Kendin dene

<?php

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

// Girişi oku
$recipient = trim(fgets(STDIN));
$message = trim(fgets(STDIN));

// TODO: Her bildirim türünden birer örnek oluşturun (hepsi aynı alıcıyı kullanmalı)

// TODO: Her bildirim üzerinde mesajla birlikte send() metodunu çağırın
// Her sonucu şu sırayla kendi satırında yazdırın:
// 1. Normal bildirim (Regular notification)
// 2. Acil bildirim (Urgent notification)
// 3. Günlüklü bildirim (Logged notification)

?>
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