Metot Geçersiz Kılmayı Yeniden Ele Alma
Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 33 / 91.
Kalıtım bölümünde metot geçersiz kılmayı zaten öğrendin. Şimdi bunun nesne yönelimli programlamadaki en güçlü kavramlardan biri olan polimorfizm ile nasıl bağlantılı olduğunu keşfedelim.
Polimorfizm “çok biçim” anlamına gelir. Bir alt sınıfta bir metodu geçersiz kıldığınızda, aynı adı korurken o metoda farklı bir biçim kazandırırsınız. Sihir, nesnelerle üst türleri üzerinden çalıştığınızda gerçekleşir:
<?php
class Animal {
public function speak() {
return "Some sound";
}
}
class Dog extends Animal {
public function speak() {
return "Woof!";
}
}
class Cat extends Animal {
public function speak() {
return "Meow!";
}
}
function makeAnimalSpeak(Animal $animal) {
return $animal->speak();
}
echo makeAnimalSpeak(new Dog()) . "\n";
echo makeAnimalSpeak(new Cat());
Çıktı:
Woof!
Meow!makeAnimalSpeak() işlevi herhangi bir Animal kabul eder. Dog veya Cat alıp almadığını bilmez ve önemsemez. PHP, çalışma zamanında gerçek nesne türüne göre doğru şekilde geçersiz kılınmış yöntemi otomatik olarak çağırır.
Bu, polimorfizmin iş başındaki hâlidir.
Bu yaklaşım, belirli türlerini bilmeden birbiriyle ilişkili nesneler ailesiyle çalışan esnek kodlar yazmanı sağlar. Daha sonra yeni hayvan sınıfları ekleyebilirsin ve işlev bunlarla otomatik olarak çalışır.
Temel Nokta: Metot geçersiz kılma, farklı sınıfların aynı metot çağrısına farklı şekilde yanıt vermesine olanak tanıyarak çok biçimliliği mümkün kılar; bu yanıt, çalışma zamanında gerçek nesne türüne göre belirlenir.
Görev
KolayMetot geçersiz kılma yoluyla çok biçimliliği gösteren bir müzik aleti sistemi oluşturalım. Bir temel Instrument sınıfı ve her biri kendine özgü bir ses üreten iki alt sınıf oluşturacak, ardından herhangi bir müzik aletini çok biçimli olarak çalmak için tek bir işlev kullanacaksın.
Kodunu dört dosyaya ayıracaksın:
Instrument.php: Yapıcı aracılığıyla ayarlanan korumalı bir$nameözelliğine sahip birInstrumentsınıfı oluştur."[name] makes a sound"döndüren birplay()metodu ekle. Bu, alt sınıfların geçersiz kılacağı temel davranış olarak görev yapar.Guitar.php:Instrumentsınıfını genişleten birGuitarsınıfı oluştur. Üst sınıf dosyasını dahil et. Yapıcı, adı kabul eder ve üst sınıf yapıcısına iletir."[name] strums a chord"döndürecek şekildeplay()metodunu geçersiz kıl.Drum.php:Instrumentsınıfını genişleten birDrumsınıfı oluştur. Üst sınıf dosyasını dahil et. Yapıcı, adı kabul eder ve üst sınıf yapıcısına iletir."[name] beats a rhythm"döndürecek şekildeplay()metodunu geçersiz kıl.main.php: Hem Guitar hem de Drum dosyalarını dahil et.Instrumentparametresi (tür ipuçlu) kabul eden ve üzerindeplay()çağrısının sonucunu döndürenperformWithadlı bir işlev oluştur. Bu işlev çok biçimliliği gösterir. Üst sınıf tür ipucu sayesinde her müzik aleti türüyle çalışır.
İki girdi alacaksın: gitar için bir ad ve davul için bir ad. Bu adlarla bir Guitar ve bir Drum oluştur. Her birini performWith() işlevine ilet ve sonuçları yazdır: önce gitar, ardından davul; her biri kendi satırında olmalı.
performWith() işlevinin herhangi bir Instrument kabul etmesine rağmen PHP'nin çalışma zamanında gerçek nesne türüne göre doğru geçersiz kılınmış play() metodunu otomatik olarak çağırdığına dikkat et. İşte çok biçimlilik budur!
Kendin dene
<?php
// Enstrüman dosyalarını dahil et
require_once 'Guitar.php';
require_once 'Drum.php';
// Girdiyi oku
$guitarName = trim(fgets(STDIN));
$drumName = trim(fgets(STDIN));
// TODO: performWith adında bir fonksiyon oluştur ki:
// - Bir Instrument parametresi kabul eder (tip ipucu kullan: Instrument $instrument)
// - Enstrüman üzerinde play() çağrısının sonucunu döndürür
// TODO: $guitarName ile bir Guitar ve $drumName ile bir Drum oluştur
// TODO: Her birini performWith()'e geçir ve sonuçları yazdır (önce gitar, sonra davul)
?>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