Menu
Coddy logo textTech

Implementowanie interfejsów

Część sekcji Programowanie obiektowe ścieżki PHP w Coddy. Lekcja 28 z 91.

Skoro wiesz już, czym są interfejsy, zobaczmy, jak je zaimplementować. Klasa implementuje interfejs za pomocą słowa kluczowego implements i musi dostarczyć konkretne implementacje wszystkich metod zadeklarowanych w tym interfejsie.

<?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();

Wynik:

Printing: Hello World

Klasa Document implementuje Printable, udostępniając własną wersję metody print(). Jeśli zapomnisz zaimplementować wymaganą metodę, PHP zgłosi błąd krytyczny.

Różne klasy mogą implementować ten sam interfejs na swój sposób:

<?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();

Wynik:

Invoice Total: $150

Zarówno Document, jak i Invoice spełniają kontrakt Printable, ale każdy z nich obsługuje drukowanie inaczej, w zależności od swojego przeznaczenia.

Kluczowa kwestia: Użyj implements, aby powiązać klasę z interfejsem, a następnie zdefiniuj wszystkie wymagane metody. Każda implementująca klasa dostarcza własną logikę, gwarantując jednocześnie, że istnieją te same sygnatury metod.

challenge icon

Wyzwanie

Łatwy

Zbudujmy system wiadomości, który pokazuje, jak różne klasy mogą implementować ten sam interfejs na własne, unikalne sposoby.

Utworzysz trzy pliki, które będą współpracować przy obsłudze różnych typów wiadomości:

  • Messageable.php: Zdefiniuj interfejs Messageable z dwiema sygnaturami metod: compose($content) i deliver(). Ten interfejs określa kontrakt, którego muszą przestrzegać wszystkie typy wiadomości.
  • Email.php: Utwórz klasę Email, która implementuje Messageable. Na początku dołącz plik interfejsu. Klasa powinna mieć prywatną właściwość $recipient i prywatną właściwość $body. Konstruktor przyjmuje adres odbiorcy. Zaimplementuj compose($content), aby zapisać treść w $body i zwrócić "Email composed". Zaimplementuj deliver(), aby zwracać "Email to [recipient]: [body]".
  • SMS.php: Utwórz klasę SMS, która również implementuje Messageable. Na początku dołącz plik interfejsu. Klasa powinna mieć prywatną właściwość $phoneNumber i prywatną właściwość $text. Konstruktor przyjmuje numer telefonu. Zaimplementuj compose($content), aby zapisać treść w $text i zwrócić "SMS composed". Zaimplementuj deliver(), aby zwracać "SMS to [phoneNumber]: [text]".

W pliku main.php dołącz pliki Email i SMS. Otrzymasz trzy dane wejściowe: adres e-mail, numer telefonu i treść wiadomości. Utwórz obiekt Email z adresem e-mail oraz obiekt SMS z numerem telefonu. Wywołaj compose() z treścią wiadomości na obu obiektach, wyświetlając każdy wynik w osobnym wierszu. Następnie wywołaj deliver() na obu obiektach, wyświetlając każdy wynik w osobnym wierszu. Kolejność powinna być następująca: tworzenie wiadomości e-mail, tworzenie SMS-a, dostarczenie wiadomości e-mail, dostarczenie SMS-a.

Obie klasy spełniają ten sam kontrakt Messageable, ale każda obsługuje tworzenie i dostarczanie wiadomości zgodnie ze swoim przeznaczeniem: wiadomości e-mail pokazują adres odbiorcy, a wiadomości SMS — numer telefonu.

Spróbuj swoich sił

<?php
require_once 'Email.php';
require_once 'SMS.php';

// Odczytaj dane wejściowe
$emailAddress = trim(fgets(STDIN));
$phoneNumber = trim(fgets(STDIN));
$messageContent = trim(fgets(STDIN));

// TODO: Utwórz obiekt Email z adresem e-mail

// TODO: Utwórz obiekt SMS z numerem telefonu

// TODO: Wywołaj compose() na obu obiektach i wypisz wyniki
// Kolejność: compose dla email, następnie compose dla SMS

// TODO: Wywołaj deliver() na obu obiektach i wypisz wyniki
// Kolejność: deliver dla email, następnie deliver dla SMS
?>
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator PHP online