Menu
Coddy logo textTech

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.

challenge icon

Görev

Kolay

Metot 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 bir Instrument sınıfı oluştur. "[name] makes a sound" döndüren bir play() metodu ekle. Bu, alt sınıfların geçersiz kılacağı temel davranış olarak görev yapar.
  • Guitar.php: Instrument sınıfını genişleten bir Guitar sı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 şekilde play() metodunu geçersiz kıl.
  • Drum.php: Instrument sınıfını genişleten bir Drum sı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 şekilde play() metodunu geçersiz kıl.
  • main.php: Hem Guitar hem de Drum dosyalarını dahil et. Instrument parametresi (tür ipuçlu) kabul eden ve üzerinde play() çağrısının sonucunu döndüren performWith adlı 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)

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

Kendi başına pratik yap: Online PHP derleyicisi