Birden Çok 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ü uygulamasına izin verir. Bu, farklı sözleşmeleri birleştirme esnekliği sunarak sınıflarınızı daha çok yönlü hâle getirir.
Birden fazla arayüz uygulamak için implements anahtar sözcüğünden sonra arayüzleri virgüllerle 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 ReportReport sınıfı, Printable ve Savable içindeki 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.
Bu yaklaşım güçlüdür, çünkü tekli kalıtımın kısıtlamaları olmadan birden çok 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 çok arayüzü uygulamak için virgül kullanın. Sınıfınız, uyguladığı her arayüzdeki tüm yöntemlerin somut uygulamalarını sağlamalıdır.
Görev
KolayTek bir sınıfın farklı yetenekler kazanmak için birden fazla arayüzü nasıl uygulayabileceğini gösteren bir medya dosyası sistemi oluşturalım.
Hem oynatılabilen hem de paylaşılabilen medya dosyalarını işlemek üzere birlikte çalışan dört dosya oluşturacaksın:
Playable.php: Tek bir metot imzasına sahipPlayablearayüzünü tanımla:play(). Bu sözleşme, oynatılabilir herhangi bir medyanın başlatılabilmesini sağlar.Shareable.php: Tek bir metot imzasına sahipShareablearayüzünü tanımla:share($platform). Bu sözleşme, paylaşılabilir herhangi bir içeriğin farklı platformlara dağıtılabilmesini sağlar.Video.php: HemPlayablehem deShareablearayüzlerini uygulayan birVideosınıfı oluştur. Her iki arayüz dosyasını da en üstte dahil et. Sınıf, özel bir$titleözelliğine ve özel bir$durationözelliğine (dakika cinsinden) sahip olmalıdır. Yapıcı, başlığı ve süreyi kabul eder.play()metodunu,"Playing video: [title] ([duration] min)"döndürecek şekilde uygula.share($platform)metodunu,"Sharing [title] on [platform]"döndürecek şekilde uygula.main.php: Video dosyasını dahil et. Üç girdi alacaksın: video başlığı, bir tamsayıya dönüştürülecek süre (bir dize olarak) ve bir platform adı. Başlık ve süreyle birVideonesnesi oluştur. İlk satırdaplay()çağrısının sonucunu yazdır, ardından ikinci satırda platformla birlikteshare()çağrısının sonucunu yazdır.
Video sınıfın aynı anda iki ayrı sözleşmeyi yerine getirir. Her 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.
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: title ve duration ile bir Video nesnesi oluştur
// TODO: play() çağrısının sonucunu ilk satıra yazdır
// TODO: platform ile share() çağrısının sonucunu ikinci satıra yazdır
?>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
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesneler$this Anahtar SözcüğüMetotlarÖzelliklerYapıcı (__construct)Yıkıcı (__destruct)Tekrar - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımparent:: Anahtar SözcüğüMetot Geçersiz Kılmafinal Anahtar SözcüğüSoyut SınıflarTekrar - Çalışan Hiyerarşisi7Kapsülleme
Public, Protected, PrivateErişim Belirleyicileri DerinlemesineGetter ve Setter'larBilgi GizlemeYapıcı Özellik Terfisi (8.0)Tekrar - Öğrenci Kayıt Sistemi10İleri Düzey OOP Kavramları
Composition ve KalıtımBağımlılık EnjeksiyonuAnonim SınıflarEnum'lar (PHP 8.1)Fiber'lar (PHP 8.1)Nesne Klonlamaya Derinlemesine BakışÜreteçler ve Yineleyiciler13Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıBileşik KalıpDepo Kalıbı2Namespace’ler ve Autoloading
Namespace’lere Girişuse Anahtar SözcüğüPSR-4 Autoloading StandardıComposer AutoloaderTekrar - Düzenli Proje5Arayüzler ve Sözleşmeler
Arayüzlere GirişArayüzleri UygulamaBirden Çok Arayüz UygulamaArayüz ve Soyut Sınıf KarşılaştırmasıArayüzlerle Tür İpuçlarıTekrar - Şekil Hesaplayıcı8Sihirli Metotlar
Sihirli Metotlara Giriş__toString ve __debugInfo__get, __set, __isset, __unset__call ve __callStatic__clone ve Nesne Klonlama__serialize ve __unserializeTekrar - Özel Koleksiyon3Sınıf Özellikleri
Örnek ve Statik ÖzelliklerSınıflarda SabitlerStatik Metotlar ve ÖzelliklerPrivate ve Protected ÖzelliklerSalt Okunur Özellikler (PHP 8.1)Tekrar - Banka Hesabı Yöneticisi6Çok Biçimlilik
Metot Geçersiz Kılmayı Yeniden Ele AlmaArayüzler Yoluyla Çok BiçimlilikTür İpuçları ve Birleşim TürleriGeç Bağlanan Statik ÇağrılarÖzet - Ödeme İşlemcisi9Trait'ler
Trait'lere GirişBirden Çok Trait KullanımıTrait Çakışmalarını ÇözümlemeTrait'lerde Soyut MetotlarTrait'ler ve Kalıtım Karşılaştırması12Tasarım Desenleri 1. Bölüm
Tasarım Desenlerine GirişSingleton DeseniFactory DeseniObserver DeseniStrategy DeseniKendi başına pratik yap: Online PHP derleyicisi