Menu
Coddy logo textTech

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.

challenge icon

Görev

Kolay

Metot 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 bir Instrument sınıfı oluşturun. "[name] makes a sound" döndüren bir play() metodu ekleyin. Bu, alt sınıfların geçersiz kılacağı temel davranışı temsil eder.
  • Guitar.phpInstrument sınıfını genişleten bir Guitar sı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.phpInstrument sınıfını genişleten bir Drum sı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. Bir Instrument parametresi (tür belirteçli - type-hinted) kabul eden ve üzerinde play() metodunu çağırmanın sonucunu döndüren performWith adı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!

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)

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