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 meowCat 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.
Görev
KolayAlt 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 birNotificationsı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 birsend($message)yöntemi ekle.UrgentNotification.php:Notificationsınıfını genişleten birUrgentNotificationsınıfı tanımla. En üstte Notification dosyasını dahil et. Bu sınıf,"URGENT to [recipient]: [message]!!!"değerini döndürmek üzeresend($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:Notificationsınıfını genişleten birLoggedNotificationsı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
?>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 SözcüğüMetotlarÖzelliklerYapıcı (__construct)Yıkıcı (__destruct)Tekrar - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımparent:: Anahtar SözcüğüMetot Geçersiz Kılmafinal Anahtar SözcüğüSoyut SınıflarTekrar - Çalışan Hiyerarşisi7Kapsülleme
Public, Protected, PrivateErişim Belirleyicileri DerinlemesineGetter ve Setter'larBilgi GizlemeYapıcı Özellik Terfisi (8.0)Tekrar - Öğrenci Kayıt Sistemi10İleri Düzey OOP Kavramları
Composition ve KalıtımBağımlılık EnjeksiyonuAnonim SınıflarEnum'lar (PHP 8.1)Fiber'lar (PHP 8.1)Nesne Klonlamaya Derinlemesine BakışÜreteçler ve Yineleyiciler13Tasarı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ıBileşik KalıpDepo Kalıbı2Namespace’ler ve Autoloading
Namespace’lere Girişuse Anahtar SözcüğüPSR-4 Autoloading StandardıComposer AutoloaderTekrar - Düzenli Proje5Arayüzler ve Sözleşmeler
Arayüzlere GirişArayüzleri UygulamaBirden Çok Arayüz UygulamaArayüz ve Soyut Sınıf KarşılaştırmasıArayüzlerle Tür İpuçlarıTekrar - Şekil Hesaplayıcı8Sihirli Metotlar
Sihirli Metotlara Giriş__toString ve __debugInfo__get, __set, __isset, __unset__call ve __callStatic__clone ve Nesne Klonlama__serialize ve __unserializeTekrar - Özel Koleksiyon3Sınıf Özellikleri
Örnek ve Statik ÖzelliklerSınıflarda SabitlerStatik Metotlar ve ÖzelliklerPrivate ve Protected ÖzelliklerSalt Okunur Özellikler (PHP 8.1)Tekrar - Banka Hesabı Yöneticisi6Çok Biçimlilik
Metot Geçersiz Kılmayı Yeniden Ele AlmaArayüzler Yoluyla Çok BiçimlilikTür İpuçları ve Birleşim TürleriGeç Bağlanan Statik ÇağrılarÖzet - Ödeme İşlemcisi9Trait'ler
Trait'lere GirişBirden Çok Trait KullanımıTrait Çakışmalarını ÇözümlemeTrait'lerde Soyut MetotlarTrait'ler ve Kalıtım Karşılaştırması12Tasarım Desenleri 1. Bölüm
Tasarım Desenlerine GirişSingleton DeseniFactory DeseniObserver DeseniStrategy DeseniKendi başına pratik yap: Online PHP derleyicisi