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!

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)

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