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 videostartMedia() 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.
Görev
KolayArayü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 birExportablearayü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.php—Exportablearayüzünü uygulayan birReportsı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— YineExportablearayüzünü uygulayan birInvoicesı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.Exportabletüründe bir parametre kabul eden ve üzerindeexport()metodunu çağırmanın sonucunu döndürenprocessDocumentadında bir fonksiyon oluşturun. Bu fonksiyon arayüz tür belirlemesi kullanır —Exportablearayü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)
?>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