Menu
Coddy logo textTech

Implementowanie wielu interfejsów

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

W przeciwieństwie do dziedziczenia, w którym klasa może rozszerzać tylko jedną klasę nadrzędną, PHP pozwala klasie implementować wiele interfejsów. Daje ci to elastyczność w łączeniu różnych kontraktów, dzięki czemu twoje klasy są bardziej wszechstronne.

Aby zaimplementować wiele interfejsów, oddziel je przecinkami po słowie kluczowym implements:

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

Wynik:

Printing: Sales Report
Saving: Sales Report

Klasa Report spełnia oba kontrakty, implementując wszystkie metody z interfejsów Printable i Savable. Musisz dostarczyć implementacje wszystkich metod zadeklarowanych w każdym interfejsie.

To podejście jest potężne, ponieważ pozwala tworzyć klasy, które spełniają wiele wymagań bez ograniczeń związanych z dziedziczeniem pojedynczym. Klasa może być jednocześnie przeznaczona do drukowania, zapisywania, eksportowania i wielu innych rzeczy.

Najważniejsze: Używaj przecinków, aby implementować wiele interfejsów. Twoja klasa musi zawierać konkretne implementacje wszystkich metod z każdego interfejsu, który implementuje.

challenge icon

Wyzwanie

Łatwy

Zbudujmy system plików multimedialnych, który pokazuje, jak jedna klasa może implementować wiele interfejsów, aby zyskać różne możliwości.

Utworzysz cztery współpracujące ze sobą pliki do obsługi plików multimedialnych, które można zarówno odtwarzać, jak i udostępniać:

  • Playable.php: Zdefiniuj interfejs Playable z jedną sygnaturą metody: play(). Ten kontrakt zapewnia, że każde odtwarzalne medium można uruchomić.
  • Shareable.php: Zdefiniuj interfejs Shareable z jedną sygnaturą metody: share($platform). Ten kontrakt zapewnia, że każdą treść, którą można udostępniać, można rozpowszechniać na różnych platformach.
  • Video.php: Utwórz klasę Video, która implementuje zarówno Playable, jak i Shareable. Na początku dołącz oba pliki interfejsów. Klasa powinna mieć prywatną właściwość $title i prywatną właściwość $duration (w minutach). Konstruktor przyjmuje tytuł i czas trwania. Zaimplementuj play(), aby zwracała "Playing video: [title] ([duration] min)". Zaimplementuj share($platform), aby zwracała "Sharing [title] on [platform]".
  • main.php: Dołącz plik Video. Otrzymasz trzy dane wejściowe: tytuł filmu, czas trwania (jako ciąg znaków do przekonwertowania na liczbę całkowitą) oraz nazwę platformy. Utwórz obiekt Video z tytułem i czasem trwania. Wypisz wynik wywołania play() w pierwszym wierszu, a następnie wypisz wynik wywołania share() z platformą w drugim wierszu.

Twoja klasa Video jednocześnie spełnia dwa odrębne kontrakty. Można ją odtwarzać tak jak dowolne medium, a także udostępniać na platformach społecznościowych. Na tym polega siła implementowania wielu interfejsów: jedna klasa zyskuje możliwości z różnych źródeł, nie ograniczając się do pojedynczego łańcucha dziedziczenia.

Spróbuj swoich sił

<?php
// Dołącz plik Video
require_once 'Video.php';

// Odczytaj dane wejściowe
$title = trim(fgets(STDIN));
$duration = intval(trim(fgets(STDIN)));
$platform = trim(fgets(STDIN));

// TODO: Utwórz obiekt Video z tytułem i czasem trwania

// TODO: Wypisz w pierwszym wierszu wynik wywołania play()

// TODO: Wypisz w drugim wierszu wynik wywołania share() z platformą

?>
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