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 meowCat 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.
Görev
KolayAlt 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 birNotificationsı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 birsend($message)metodu ekleyin.UrgentNotification.php—Notificationsınıfını genişleten birUrgentNotificationsı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.php—Notificationsınıfını genişleten birLoggedNotificationsınıfı tanımlayın. Notification dosyasını en üste dahil edin. Bu sınıfsend($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)
?>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
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesneler$this Anahtar KelimesiMetotlarÖzelliklerYapıcı Metot (__construct)Yıkıcı Metot (__destruct)Özet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımparent:: Anahtar KelimesiMetot Geçersiz Kılmafinal Anahtar KelimesiSoyut SınıflarÖzet - Çalışan Hiyerarşisi7Kapsülleme
Public, Protected, PrivateErişim Belirleyicilere Derinlemesine BakışGetter ve Setter MetotlarıBilgi GizlemeConstructor Promotion (8.0)Özet - Öğrenci Kayıt Sistemi10İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımDependency InjectionAnonim SınıflarEnum'lar (PHP 8.1)Fiber'lar (PHP 8.1)Nesne Klonlama: Derinlemesine İncelemeGenerator'lar ve Iterator'lar13Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıRepository Kalıbı2İsim Alanları ve Autoloading
İsim Alanlarına Girişuse Anahtar KelimesiPSR-4 Autoloading StandartıComposer AutoloaderÖzet - Düzenli Proje5Arayüzler ve Sözleşmeler
Arayüzlere GirişArayüzleri UygulamaBirden Fazla Arayüz UygulamaArayüz vs Soyut SınıfArayüzler ile Tip BelirlemeÖzet - Şekil Hesaplayıcı8Sihirli Metotlar
Sihirli Metotlara Giriş__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Nesne Klonlama__serialize & __unserializeÖzet - Özel Koleksiyon3Sınıf Özellikleri
Örnek ve Statik ÖzelliklerSınıflarda SabitlerStatik Metotlar ve ÖzelliklerPrivate ve Protected ÖzelliklerReadonly Özellikler (PHP 8.1)Özet - Banka Hesabı Yöneticisi6Çok Biçimlilik
Metot Geçersiz Kılmaya Yeniden BakışArayüzler ile Çok BiçimlilikType Hinting ve Union TypesLate Static BindingÖzet - Ödeme İşlemcisi9Trait'ler
Trait'lere GirişÇoklu Trait KullanımıTrait Çakışma ÇözümüTrait'lerde Soyut MetotlarTrait'ler ve Kalıtım12Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı15Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi