Abstrakte Klassen
Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy. Lektion 25 von 91.
Eine abstrakte Klasse ist eine Klasse, die nicht direkt instanziiert werden kann. Sie dient als Vorlage für andere Klassen und definiert Methoden, die Kindklassen implementieren müssen. Du erstellst eine abstrakte Klasse mit dem Schlüsselwort abstract.
<?php
abstract class Shape {
protected $color;
public function __construct($color) {
$this->color = $color;
}
abstract public function calculateArea();
public function getColor() {
return $this->color;
}
}
class Rectangle extends Shape {
private $width;
private $height;
public function __construct($color, $width, $height) {
parent::__construct($color);
$this->width = $width;
$this->height = $height;
}
public function calculateArea() {
return $this->width * $this->height;
}
}
$rect = new Rectangle("blue", 5, 3);
echo $rect->calculateArea();
Ausgabe:
15Die Klasse Shape deklariert eine abstrakte Methode calculateArea(), ohne eine Implementierung bereitzustellen. Jede Klasse, die Shape erweitert, muss diese Methode implementieren. Beachte, dass abstrakte Klassen auch reguläre Methoden wie getColor() enthalten können, die Kindklassen direkt erben.
Abstrakte Methoden legen fest, was eine Kindklasse tun muss, aber nicht wie. Dadurch wird sichergestellt, dass alle Formen über eine calculateArea()-Methode verfügen, während jede Form ihre Fläche auf unterschiedliche Weise berechnen kann.
Wichtiger Punkt: Abstrakte Klassen verbinden die Struktur der Vererbung mit verbindlichen Anforderungen. Verwende sie, wenn du Code unter verwandten Klassen teilen und gleichzeitig sicherstellen möchtest, dass bestimmte Methoden von jeder untergeordneten Klasse implementiert werden.
Aufgabe
EinfachLass uns ein Mediaplayer-System erstellen, das zeigt, wie abstrakte Klassen einen Vertrag erzwingen und gleichzeitig verschiedenen Medientypen ermöglichen, ihr eigenes Wiedergabeverhalten zu implementieren.
Du wirst deinen Code auf drei Dateien verteilen:
Media.php: Definiere eine abstrakteMedia-Klasse, die als Vorlage für alle Medientypen dient. Sie sollte eine geschützte Eigenschaft$titleund einen Konstruktor besitzen, der den Titel entgegennimmt und festlegt. Füge eine abstrakte Methode namensplay()hinzu, die Kindklassen implementieren müssen. Füge außerdem eine reguläre MethodegetTitle()hinzu, die den Titel zurückgibt. Diese konkrete Methode wird von allen Kindklassen geerbt.Song.php: Definiere eineSong-Klasse, dieMediaerweitert. Binde die Media-Datei am Anfang ein. Diese Klasse fügt eine Eigenschaft$artisthinzu. Der Konstruktor sollte Titel und Künstler entgegenehmen: Verwendeparent::__construct()für den Titel und lege anschließend den Künstler selbst fest. Implementiere die erforderliche Methodeplay(), die"Playing song: [title] by [artist]"zurückgibt.Podcast.php: Definiere einePodcast-Klasse, dieMediaerweitert. Binde die Media-Datei am Anfang ein. Diese Klasse fügt eine Eigenschaft$episodehinzu (eine Ganzzahl). Der Konstruktor sollte Titel und Episodennummer entgegenehmen: Verwendeparent::__construct()für den Titel und lege anschließend die Episode fest. Implementiere die erforderliche Methodeplay(), die"Playing podcast: [title] - Episode [episode]"zurückgibt.
Binde in main.php sowohl die Song- als auch die Podcast-Datei ein. Du erhältst vier Eingaben: den Songtitel, den Namen des Künstlers, den Podcasttitel und die Episodennummer (als Zeichenfolge, die in eine Ganzzahl umgewandelt werden soll). Erstelle mit diesen Werten ein Song- und ein Podcast-Objekt. Gib zuerst das Ergebnis des Aufrufs von play() für den Song und anschließend für den Podcast aus, jeweils in einer eigenen Zeile.
Diese Aufgabe zeigt, wie abstrakte Klassen einen Vertrag definieren: Jeder Medientyp muss eine play()-Methode besitzen, aber jeder Typ implementiert sie unterschiedlich. Die abstrakte Media-Klasse kann nicht direkt instanziiert werden; sie existiert nur, um ihren Kindklassen Struktur und gemeinsame Funktionalität bereitzustellen.
Probier es selbst
<?php
require_once 'Song.php';
require_once 'Podcast.php';
// Eingaben lesen
$songTitle = trim(fgets(STDIN));
$artistName = trim(fgets(STDIN));
$podcastTitle = trim(fgets(STDIN));
$episodeNumber = intval(trim(fgets(STDIN)));
// TODO: Erstelle ein Song-Objekt mit songTitle und artistName
// TODO: Erstelle ein Podcast-Objekt mit podcastTitle und episodeNumber
// TODO: Gib das Ergebnis des Aufrufs von play() auf dem Song aus
// TODO: Gib das Ergebnis des Aufrufs von play() auf dem Podcast aus
?>Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in OOPKlassen vs. ObjekteDas Schlüsselwort $thisMethodenEigenschaftenKonstruktor (__construct)Destruktor (__destruct)Rückblick – Einfacher Taschenrechner4Vererbung
Grundlegende VererbungDas Schlüsselwort parent::MethodenüberschreibungDas Schlüsselwort finalAbstrakte KlassenRückblick – Mitarbeiterhierarchie7Kapselung
Öffentlich, geschützt, privatZugriffsmodifikatoren im DetailGetter und SetterInformationsverbergungKonstruktor-Promotion (8.0)Wiederholung – System zur Verwaltung von Schülerdatensätzen2Namespaces & Autoloading
Einführung in NamespacesDas use-SchlüsselwortPSR-4-Autoloading-StandardComposer-AutoloaderRückblick – Organisiertes Projekt5Schnittstellen & Verträge
Einführung in SchnittstellenSchnittstellen implementierenMehrere Schnittstellen implementierenSchnittstelle vs. abstrakte KlasseTyp-Hinweise mit SchnittstellenRückblick – Formrechner8Magische Methoden
Einführung in magische Methoden__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Objektklonen__serialize & __unserializeRückblick – Benutzerdefinierte Sammlung11Typsystem & Fehlerbehandlung
TypdeklarationenNullable-TypenUnion- & Intersection-TypenException-KlassenBenutzerdefinierte Exception-HierarchieTry, Catch, FinallyRückblick – Formularvalidator14Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen3Klassen-Eigenschaften
Instanz- vs. statische EigenschaftenKonstanten in KlassenStatische Methoden & EigenschaftenPrivate & geschützte EigenschaftenSchreibgeschützte Eigenschaften (PHP 8.1)Zusammenfassung – Bankkonto-Manager6Polymorphie
Methodenüberschreibung erneut betrachtetPolymorphie über SchnittstellenTyp-Hinweise & Union-TypenSpätes statisches BindenRückblick – Zahlungsabwickler9Traits
Einführung in TraitsMehrere Traits verwendenAuflösung von Trait-KonfliktenAbstrakte Methoden in TraitsTraits vs. Vererbung12Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster15Abschließende Herausforderungen
E-Learning-PlattformBankingsystemEntwicklung einer SpielfigurFahrzeugvermietungÜbe selbstständig: Online-PHP-Compiler