Arayüzleri Uygulama
Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 28 / 91.
Artık arayüzlerin ne olduğunu anladığınıza göre, onları gerçekten nasıl uygulayacağımıza bakalım. Bir sınıf, implements anahtar sözcüğünü kullanarak bir arayüzü uygular ve o arayüzde bildirilen tüm yöntemler için somut uygulamalar sağlamalıdır.
<?php
interface Printable {
public function print();
}
class Document implements Printable {
private $content;
public function __construct($content) {
$this->content = $content;
}
public function print() {
return "Printing: " . $this->content;
}
}
$doc = new Document("Hello World");
echo $doc->print();
Çıktı:
Printing: Hello WorldDocument sınıfı, print() metodunun kendi sürümünü sağlayarak Printable arayüzünü uygular. Gerekli bir metodu uygulamayı unutursanız PHP ölümcül bir hata verir.
Farklı sınıflar aynı arayüzü kendi yöntemleriyle uygulayabilir:
<?php
class Invoice implements Printable {
private $amount;
public function __construct($amount) {
$this->amount = $amount;
}
public function print() {
return "Invoice Total: $" . $this->amount;
}
}
$invoice = new Invoice(150);
echo $invoice->print();
Çıktı:
Invoice Total: $150Hem Document hem de Invoice, Printable sözleşmesini yerine getirir; ancak her biri, amacına bağlı olarak yazdırma işlemini farklı şekilde ele alır.
Temel Nokta: Bir sınıfı bir arayüze bağlamak için implements kullanın, ardından gerekli tüm metotları tanımlayın. Her uygulayan sınıf kendi mantığını sağlar ve aynı metot imzalarının mevcut olmasını garanti eder.
Görev
KolayFarklı sınıfların aynı arayüzü kendi benzersiz yöntemleriyle nasıl uygulayabileceğini gösteren bir mesajlaşma sistemi oluşturalım.
Farklı mesaj türlerini işlemek üzere birlikte çalışan üç dosya oluşturacaksın:
Messageable.php: İki metot imzasına sahipMessageablearayüzünü tanımla:compose($content)vedeliver(). Bu arayüz, tüm mesaj türlerinin uyması gereken sözleşmeyi oluşturur.Email.php:Emailarayüzünü uygulayan birMessageablesınıfı oluştur. Arayüz dosyasını en üstte dahil et. Sınıfta özel bir$recipientözelliği ve özel bir$bodyözelliği bulunmalıdır. Yapıcı, alıcı adresini kabul eder. İçeriğicompose($content)içinde saklamak ve$bodydöndürmek için"Email composed"metodunu uygula.deliver()döndürmek için"Email to [recipient]: [body]"metodunu uygula.SMS.php: Aynı zamandaSMSarayüzünü uygulayan birMessageablesınıfı oluştur. Arayüz dosyasını en üstte dahil et. Sınıfta özel bir$phoneNumberözelliği ve özel bir$textözelliği bulunmalıdır. Yapıcı, telefon numarasını kabul eder. İçeriğicompose($content)içinde saklamak ve$textdöndürmek için"SMS composed"metodunu uygula.deliver()döndürmek için"SMS to [phoneNumber]: [text]"metodunu uygula.
main.php dosyasında hem Email hem de SMS dosyalarını dahil et. Üç girdi alacaksın: bir e-posta adresi, bir telefon numarası ve mesaj içeriği. E-posta adresiyle bir Email nesnesi ve telefon numarasıyla bir SMS nesnesi oluştur. Her iki nesne üzerinde mesaj içeriğiyle compose() metodunu çağır ve her sonucu kendi satırında yazdır. Ardından her iki nesne üzerinde deliver() metodunu çağır ve her sonucu kendi satırında yazdır. Sıra şu şekilde olmalıdır: email compose, SMS compose, email deliver, SMS deliver.
Her iki sınıf da aynı Messageable sözleşmesini yerine getirir, ancak her biri mesajları kendi amacına göre oluşturur ve gönderir: e-postalar alıcı adresini, SMS mesajları ise telefon numarasını gösterir.
Kendin dene
<?php
require_once 'Email.php';
require_once 'SMS.php';
// Girdileri oku
$emailAddress = trim(fgets(STDIN));
$phoneNumber = trim(fgets(STDIN));
$messageContent = trim(fgets(STDIN));
// TODO: E-posta adresiyle bir Email nesnesi oluştur
// TODO: Telefon numarasıyla bir SMS nesnesi oluştur
// TODO: Her iki nesne üzerinde de compose() çağır ve sonuçları yazdır
// Order: email compose, then SMS compose
// TODO: Her iki nesne üzerinde de deliver() çağır ve sonuçları yazdır
// Sıra: email deliver, sonra SMS deliver
?>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