Menu
Coddy logo textTech

Arayüzler ile Tip Belirleme

Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 31 / 91.

Arayüzlerin en güçlü kullanım alanlarından biri tür ipucu (type hinting) vermektir. Bir fonksiyon veya metot parametresinde bir arayüzü tür ipucu olarak kullandığınızda, "bu fonksiyon bu arayüzü uygulayan herhangi bir nesneyi kabul eder" demiş olursunuz. Bu, kodunuzu esnek ve yeniden kullanılabilir hale getirir.

<?php
interface Playable {
    public function play();
}

class Song implements Playable {
    public function play() {
        return "Playing song";
    }
}

class Video implements Playable {
    public function play() {
        return "Playing video";
    }
}

function startMedia(Playable $media) {
    return $media->play();
}

$song = new Song();
$video = new Video();

echo startMedia($song) . "\n";
echo startMedia($video);

Çıktı:

Playing song
Playing video

startMedia() fonksiyonu, bir Song mu yoksa Video mu aldığıyla ilgilenmez. Sadece nesnenin Playable arayüzünü uygulayıp uygulamadığıyla ve dolayısıyla bir play() metoduna sahip olup olmadığıyla ilgilenir. Bu, somut bir uygulama yerine bir arayüze göre programlama yapmanın özüdür.

Dönüş türleri için arayüz tür ipuçlarını da kullanabilirsiniz:

<?php
function createMedia(string $type): Playable {
    if ($type === "song") {
        return new Song();
    }
    return new Video();
}

Bu, belirli sınıftan bağımsız olarak, fonksiyonun her zaman Playable uygulayan bir şey döndürmesini garanti eder.

Önemli Nokta: Arayüzlerle tür ipucu (type hinting) kullanımı, o arayüzü uygulayan herhangi bir sınıfla çalışan fonksiyonlar yazmanıza olanak tanıyarak kodunuzu daha esnek ve genişletilmesi daha kolay hale getirir.

challenge icon

Görev

Kolay

Arayüzlerle (interfaces) tür belirlemenin (type hinting) gücünü gösteren bir belge işleme sistemi kuralım. Herhangi bir belge türünü işleyebilen bir fonksiyon oluşturacaksınız — doğru arayüzü uyguladığı sürece, fonksiyonunuz onunla sorunsuz bir şekilde çalışacaktır.

Kodunuzu dört dosya halinde düzenleyeceksiniz:

  • Exportable.php — Tek bir metot imzasına sahip bir Exportable arayüzü tanımlayın: export(). Bu arayüzü uygulayan herhangi bir sınıf, içeriğini bir formatta dışa aktarabileceğini taahhüt eder.
  • Report.phpExportable arayüzünü uygulayan bir Report sınıfı oluşturun. Arayüz dosyasını dahil edin. Sınıfın özel bir $title özelliği ve özel bir $data özelliği olmalıdır. Kurucu metot (constructor) her iki değeri de kabul eder. export() metodunu "Report: [title] - [data]" döndürecek şekilde uygulayın.
  • Invoice.php — Yine Exportable arayüzünü uygulayan bir Invoice sınıfı oluşturun. Arayüz dosyasını dahil edin. Sınıfın özel bir $invoiceNumber özelliği ve özel bir $amount özelliği olmalıdır. Kurucu metot her iki değeri de kabul eder. export() metodunu "Invoice #[invoiceNumber]: $[amount]" döndürecek şekilde uygulayın.
  • main.php — Hem Report hem de Invoice dosyalarını dahil edin. Exportable türünde bir parametre kabul eden ve üzerinde export() metodunu çağırmanın sonucunu döndüren processDocument adında bir fonksiyon oluşturun. Bu fonksiyon arayüz tür belirlemesi kullanır — Exportable arayüzünü uygulayan her nesneyle çalışır.

Dört girdi alacaksınız: bir rapor başlığı, rapor verisi, bir fatura numarası ve bir fatura tutarı. Bu değerlerle bir Report ve bir Invoice nesnesi oluşturun. Her birini processDocument() fonksiyonunuza gönderin ve sonuçları — önce raporu, sonra faturayı, her biri kendi satırında olacak şekilde — yazdırın.

Bu yaklaşımın güzelliği, processDocument() fonksiyonunun bir Report mu yoksa bir Invoice mu işlediğini bilmemesi veya umursamamasıdır. Sadece nesnenin dışa aktarılabileceğini bilir — bu, arayüzün garanti ettiği sözleşmedir.

Kendin dene

<?php
// Sınıf dosyalarını dahil et
require_once 'Report.php';
require_once 'Invoice.php';

// Girdileri oku
$reportTitle = trim(fgets(STDIN));
$reportData = trim(fgets(STDIN));
$invoiceNumber = trim(fgets(STDIN));
$invoiceAmount = trim(fgets(STDIN));

// TODO: processDocument adında bir fonksiyon oluşturun
// - Bir Exportable parametresi kabul etmelidir (tür belirleme kullanın)
// - Parametre üzerinde export() metodunu çağırmanın sonucunu döndürmelidir

// TODO: Rapor başlığı ve verisi ile bir Report nesnesi oluşturun

// TODO: Fatura numarası ve tutarı ile bir Invoice nesnesi oluşturun

// TODO: Her bir nesneyi processDocument() fonksiyonuna gönderin ve sonuçları yazdırın
// Önce rapor sonucunu, ardından fatura sonucunu yazdırın (her biri kendi satırında)
?>
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