Menu
Coddy logo textTech

Birden Fazla Arayüz Uygulama

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

Bir sınıfın yalnızca bir üst sınıfı genişletebildiği kalıtımın aksine, PHP bir sınıfın birden fazla arayüzü (interface) uygulamasını (implement) sağlar. Bu, farklı sözleşmeleri birleştirme esnekliği sağlayarak sınıflarınızı daha çok yönlü hale getirir.

Birden fazla arayüzü uygulamak için, bunları implements anahtar kelimesinden sonra virgülle ayırın:

<?php
interface Printable {
    public function print();
}

interface Savable {
    public function save();
}

class Report implements Printable, Savable {
    private $title;
    
    public function __construct($title) {
        $this->title = $title;
    }
    
    public function print() {
        return "Printing: " . $this->title;
    }
    
    public function save() {
        return "Saving: " . $this->title;
    }
}

$report = new Report("Sales Report");
echo $report->print() . "\n";
echo $report->save();

Çıktı:

Printing: Sales Report
Saving: Sales Report

Report sınıfı, Printable ve Savable arayüzlerindeki tüm metotları uygulayarak her iki sözleşmeyi de yerine getirir. Her bir arayüzde bildirilen her metot için uygulama sağlamalısınız.

Bu yaklaşım güçlüdür çünkü tekli kalıtımın kısıtlamaları olmadan birden fazla gereksinimi karşılayan sınıflar oluşturmanıza olanak tanır. Bir sınıf aynı anda yazdırılabilir, kaydedilebilir, dışa aktarılabilir ve daha fazlası olabilir.

Önemli Nokta: Birden fazla arayüzü uygulamak için virgül kullanın. Sınıfınız, uyguladığı her arayüzdeki tüm metotlar için somut uygulamalar sağlamalıdır.

challenge icon

Görev

Kolay

Tek bir sınıfın farklı yetenekler kazanmak için birden fazla arayüzü (interface) nasıl uygulayabileceğini gösteren bir medya dosya sistemi oluşturalım.

Hem oynatılabilen hem de paylaşılabilen medya dosyalarını işlemek için birlikte çalışan dört dosya oluşturacaksınız:

  • Playable.php — Tek bir metot imzasına sahip bir Playable arayüzü tanımlayın: play(). Bu sözleşme, oynatılabilir her medyanın başlatılabilmesini sağlar.
  • Shareable.php — Tek bir metot imzasına sahip bir Shareable arayüzü tanımlayın: share($platform). Bu sözleşme, paylaşılabilir her içeriğin farklı platformlara dağıtılabilmesini sağlar.
  • Video.php — Hem Playable hem de Shareable arayüzlerini uygulayan bir Video sınıfı oluşturun. Her iki arayüz dosyasını da en üste dahil edin. Sınıfın özel bir $title özelliği ve özel bir $duration özelliği (dakika cinsinden) olmalıdır. Yapıcı metot (constructor) başlığı ve süreyi kabul eder. play() metodunu "Playing video: [title] ([duration] min)" döndürecek şekilde uygulayın. share($platform) metodunu "Sharing [title] on [platform]" döndürecek şekilde uygulayın.
  • main.php — Video dosyasını dahil edin. Üç girdi alacaksınız: video başlığı, süre (tam sayıya dönüştürülecek bir dize olarak) ve bir platform adı. Başlık ve süre ile bir Video nesnesi oluşturun. İlk satıra play() çağrısının sonucunu yazdırın, ardından ikinci satıra platform ile birlikte share() çağrısının sonucunu yazdırın.

Video sınıfınız aynı anda iki ayrı sözleşmeyi yerine getirir — herhangi bir medya gibi oynatılabilir ve sosyal platformlarda paylaşılabilir. Birden fazla arayüz uygulamanın gücü budur: tek bir sınıf, tek bir kalıtım zinciriyle sınırlı kalmadan farklı kaynaklardan yetenekler kazanır.

Kopya kağıdı

Bir sınıf, implements anahtar kelimesinden sonra virgülle ayırarak birden fazla arayüzü uygulayabilir:

<?php
interface Printable {
    public function print();
}

interface Savable {
    public function save();
}

class Report implements Printable, Savable {
    public function print() {
        return "Printing report";
    }
    
    public function save() {
        return "Saving report";
    }
}

Sınıf, uyguladığı her arayüzdeki tüm metotlar için somut uygulamalar sağlamalıdır. Bu, bir sınıfın tekli kalıtım kısıtlamaları olmadan aynı anda birden fazla sözleşmeyi yerine getirmesine olanak tanır.

Kendin dene

<?php
// Video dosyasını dahil et
require_once 'Video.php';

// Girdileri oku
$title = trim(fgets(STDIN));
$duration = intval(trim(fgets(STDIN)));
$platform = trim(fgets(STDIN));

// TODO: Başlık ve süre ile bir Video nesnesi oluşturun

// TODO: İlk satırda play() çağırma sonucunu yazdırın

// TODO: İkinci satırda platform ile share() çağırma sonucunu yazdırın

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