Menu
Coddy logo textTech

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, bunların gerçekte nasıl uygulanacağını görelim. Bir sınıf, implements anahtar kelimesini kullanarak bir arayüzü uygular ve o arayüzde bildirilen tüm metotlar 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 World

Document 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 (fatal error) fırlatacaktır.

Farklı sınıflar, aynı arayüzü kendi yöntemleriyle uygulayabilirler:

<?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: $150

Hem Document hem de Invoice, Printable sözleşmesini yerine getirir, ancak her biri yazdırma işlemini amacına göre farklı şekilde ele alır.

Anahtar Nokta: Bir sınıfı bir arayüze bağlamak için implements kullanın, ardından gerekli tüm yöntemleri tanımlayın. Her uygulayan sınıf, aynı yöntem imzalarının var olduğunu garanti ederken kendi mantığını sağlar.

challenge icon

Görev

Kolay

Farklı sınıfların aynı arayüzü (interface) kendi benzersiz yöntemleriyle nasıl uygulayabileceğini gösteren bir mesajlaşma sistemi oluşturalım.

Farklı mesaj türlerini işlemek için birlikte çalışan üç dosya oluşturacaksınız:

  • Messageable.php — İki metot imzasına sahip Messageable arayüzünü tanımlayın: compose($content) ve deliver(). Bu arayüz, tüm mesaj türlerinin uyması gereken sözleşmeyi belirler.
  • Email.phpMessageable arayüzünü uygulayan bir Email sınıfı oluşturun. Arayüz dosyasını en üste dahil edin. Sınıfın özel bir $recipient özelliği ve özel bir $body özelliği olmalıdır. Yapıcı metot (constructor) alıcı adresini kabul eder. compose($content) metodunu, içeriği $body içinde saklayacak ve "Email composed" döndürecek şekilde uygulayın. deliver() metodunu ise "Email to [recipient]: [body]" döndürecek şekilde uygulayın.
  • SMS.php — Yine Messageable arayüzünü uygulayan bir SMS sınıfı oluşturun. Arayüz dosyasını en üste dahil edin. Sınıfın özel bir $phoneNumber özelliği ve özel bir $text özelliği olmalıdır. Yapıcı metot telefon numarasını kabul eder. compose($content) metodunu, içeriği $text içinde saklayacak ve "SMS composed" döndürecek şekilde uygulayın. deliver() metodunu ise "SMS to [phoneNumber]: [text]" döndürecek şekilde uygulayın.

main.php dosyasında, hem Email hem de SMS dosyalarını dahil edin. Üç girdi alacaksınız: bir e-posta adresi, bir telefon numarası ve bir mesaj içeriği. E-posta adresiyle bir Email nesnesi ve telefon numarasıyla bir SMS nesnesi oluşturun. Her iki nesne üzerinde de mesaj içeriğiyle compose() metodunu çağırın ve her sonucu kendi satırında yazdırın. Ardından her iki nesne üzerinde deliver() metodunu çağırın ve her sonucu kendi satırında yazdırın. Sıralama ş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ı oluşturmayı ve iletmeyi kendi amacına göre yönetir — e-postalar alıcı adresini gösterirken, SMS mesajları telefon numarasını gösterir.

Kopya kağıdı

Bir sınıf, implements anahtar kelimesini kullanarak bir arayüzü (interface) 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;
    }
}

Birden fazla sınıf aynı arayüzü uygulayabilir ve her biri kendi uygulamasını sağlayabilir:

<?php
class Invoice implements Printable {
    private $amount;
    
    public function __construct($amount) {
        $this->amount = $amount;
    }
    
    public function print() {
        return "Invoice Total: $" . $this->amount;
    }
}

Eğer bir sınıf, bir arayüzden gerekli olan tüm yöntemleri uygulayamazsa, PHP ölümcül bir hata (fatal error) verecektir.

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 adresi ile bir Email nesnesi oluşturun

// TODO: Telefon numarası ile bir SMS nesnesi oluşturun

// TODO: Her iki nesne üzerinde compose() metodunu çağırın ve sonuçları yazdırın
// Sıralama: önce email compose, sonra SMS compose

// TODO: Her iki nesne üzerinde deliver() metodunu çağırın ve sonuçları yazdırın
// Sıralama: önce email deliver, sonra SMS deliver
?>
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