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 ReportReport 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.
Görev
KolayTek 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 birPlayablearayü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 birShareablearayü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— HemPlayablehem deShareablearayüzlerini uygulayan birVideosı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 birVideonesnesi oluşturun. İlk satıraplay()çağrısının sonucunu yazdırın, ardından ikinci satıra platform ile birlikteshare()ç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
?>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 KelimesiMetotlarÖzelliklerYapıcı Metot (__construct)Yıkıcı Metot (__destruct)Özet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımparent:: Anahtar KelimesiMetot Geçersiz Kılmafinal Anahtar KelimesiSoyut SınıflarÖzet - Çalışan Hiyerarşisi7Kapsülleme
Public, Protected, PrivateErişim Belirleyicilere Derinlemesine BakışGetter ve Setter MetotlarıBilgi GizlemeConstructor Promotion (8.0)Özet - Öğrenci Kayıt Sistemi10İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımDependency InjectionAnonim SınıflarEnum'lar (PHP 8.1)Fiber'lar (PHP 8.1)Nesne Klonlama: Derinlemesine İncelemeGenerator'lar ve Iterator'lar13Tasarı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ıKompozit KalıbıRepository Kalıbı2İsim Alanları ve Autoloading
İsim Alanlarına Girişuse Anahtar KelimesiPSR-4 Autoloading StandartıComposer AutoloaderÖzet - Düzenli Proje5Arayüzler ve Sözleşmeler
Arayüzlere GirişArayüzleri UygulamaBirden Fazla Arayüz UygulamaArayüz vs Soyut SınıfArayüzler ile Tip BelirlemeÖzet - Şekil Hesaplayıcı8Sihirli Metotlar
Sihirli Metotlara Giriş__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Nesne Klonlama__serialize & __unserializeÖzet - Özel Koleksiyon3Sınıf Özellikleri
Örnek ve Statik ÖzelliklerSınıflarda SabitlerStatik Metotlar ve ÖzelliklerPrivate ve Protected ÖzelliklerReadonly Özellikler (PHP 8.1)Özet - Banka Hesabı Yöneticisi6Çok Biçimlilik
Metot Geçersiz Kılmaya Yeniden BakışArayüzler ile Çok BiçimlilikType Hinting ve Union TypesLate Static BindingÖzet - Ödeme İşlemcisi9Trait'ler
Trait'lere GirişÇoklu Trait KullanımıTrait Çakışma ÇözümüTrait'lerde Soyut MetotlarTrait'ler ve Kalıtım12Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı15Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi