Metot Geçersiz Kılmaya Yeniden Bakış
Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 33 / 91.
Kalıtım (Inheritance) bölümünde metot geçersiz kılma (method overriding) konusunu zaten öğrendiniz. Şimdi bunun, nesne yönelimli programlamanın en güçlü kavramlarından biri olan polimorfizm (çok biçimlilik) ile nasıl bağlantılı olduğunu keşfedelim.
Polimorfizm "çok biçimlilik" anlamına gelir. Bir alt sınıfta (child class) bir metodu geçersiz kıldığınızda (override), aynı ismi koruyarak o metoda farklı bir biçim vermiş olursunuz. Asıl sihir, nesnelerle üst türleri (parent type) ü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() fonksiyonu herhangi bir Animal nesnesini kabul eder. Bir Dog mu yoksa Cat mi aldığını bilmez veya umursamaz. PHP, çalışma zamanında gerçek nesne türüne bağlı olarak doğru geçersiz kılınan yöntemi otomatik olarak çağırır.
Bu, iş başındaki polimorfizmdir.
Bu yaklaşım, belirli türlerini bilmeden birbiriyle ilişkili bir nesne ailesiyle çalışan esnek kodlar yazmanıza olanak tanır. Daha sonra yeni hayvan sınıfları ekleyebilirsiniz ve fonksiyon bunlarla otomatik olarak çalışacaktır.
Anahtar Nokta: Metot geçersiz kılma (method overriding), farklı sınıfların aynı metot çağrısına farklı şekilde yanıt vermesine izin vererek polimorfizmi sağlar; bu durum çalışma zamanında gerçek nesne türü tarafından belirlenir.
Görev
KolayMetot geçersiz kılma (method overriding) yoluyla polimorfizmi (çok biçimlilik) gösteren bir müzik aleti sistemi oluşturalım. Bir temel Instrument sınıfı ve her biri kendine özgü ses çıkaran iki alt sınıf oluşturacaksınız; ardından herhangi bir enstrümanı polimorfik olarak çalmak için tek bir fonksiyon kullanacaksınız.
Kodunuzu dört dosya halinde düzenleyeceksiniz:
Instrument.php— Yapıcı metot (constructor) aracılığıyla ayarlanan korumalı (protected) bir$nameözelliğine sahip birInstrumentsınıfı oluşturun."[name] makes a sound"döndüren birplay()metodu ekleyin. Bu, alt sınıfların geçersiz kılacağı temel davranışı temsil eder.Guitar.php—Instrumentsınıfını genişleten birGuitarsınıfı oluşturun. Üst dosyayı (parent file) dahil edin. Yapıcı metot ismi kabul eder ve bunu üst sınıfın yapıcı metoduna iletir.play()metodunu"[name] strums a chord"döndürecek şekilde geçersiz kılın.Drum.php—Instrumentsınıfını genişleten birDrumsınıfı oluşturun. Üst dosyayı dahil edin. Yapıcı metot ismi kabul eder ve bunu üst sınıfın yapıcı metoduna iletir.play()metodunu"[name] beats a rhythm"döndürecek şekilde geçersiz kılın.main.php— Hem Guitar hem de Drum dosyalarını dahil edin. BirInstrumentparametresi (tür belirteçli - type-hinted) kabul eden ve üzerindeplay()metodunu çağırmanın sonucunu döndürenperformWithadında bir fonksiyon oluşturun. Bu fonksiyon polimorfizmi gösterir; üst sınıf tür belirteci sayesinde her türlü enstrüman tipiyle çalışır.
İki girdi alacaksınız: gitar için bir isim ve davul için bir isim. Bu isimlerle bir Guitar ve bir Drum nesnesi oluşturun. Her birini performWith() fonksiyonunuza gönderin ve sonuçları yazdırın — önce gitar, sonra davul, her biri kendi satırında olacak şekilde.
performWith() fonksiyonunun herhangi bir Instrument nesnesini nasıl kabul ettiğine, ancak PHP'nin çalışma zamanında gerçek nesne türüne bağlı olarak doğru geçersiz kılınmış play() metodunu otomatik olarak nasıl çağırdığına dikkat edin. İşte bu, iş başındaki polimorfizmdir!
Kopya kağıdı
Polimorfizm "çok biçimlilik" anlamına gelir ve farklı sınıfların nesnelerinin, kendi özel davranışlarını korurken üst türleri aracılığıyla işlenmesine olanak tanır.
Alt sınıflarda bir metodu geçersiz kıldığınızda (override), PHP çalışma zamanında gerçek nesne türüne bağlı olarak otomatik olarak doğru sürümü çağırır:
<?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()); // Woof!
echo makeAnimalSpeak(new Cat()); // Meow!
makeAnimalSpeak() fonksiyonu, parametre türü ipucu (type hint) aracılığıyla herhangi bir Animal türünü kabul eder. Belirli sınıfı bilmesine gerek yoktur - PHP, çalışma zamanında gerçek nesne türüne dayanarak hangi geçersiz kılınan metodun çağrılacağını belirler.
Bu, belirli türlerini bilmeden birbiriyle ilişkili bir nesne ailesiyle çalışan esnek kodlar yazılmasını sağlar. Daha sonra yeni alt sınıflar eklenebilir ve bunlar mevcut fonksiyonlarla otomatik olarak çalışacaktır.
Kendin dene
<?php
// Enstrüman dosyalarını dahil edin
require_once 'Guitar.php';
require_once 'Drum.php';
// Girdiyi oku
$guitarName = trim(fgets(STDIN));
$drumName = trim(fgets(STDIN));
// YAPILACAK: Şunları yapan performWith adında bir fonksiyon oluşturun:
// - Bir Instrument parametresi kabul eder (tür ipucu kullanın: Instrument $instrument)
// - Enstrüman üzerinde play() metodunu çağırmanın sonucunu döndürür
// YAPILACAK: $guitarName ile bir Guitar ve $drumName ile bir Drum oluşturun
// YAPILACAK: Her birini performWith() fonksiyonuna geçirin ve sonuçları yazdırın (ö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 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