Union- & Intersection-Typen
Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy. Lektion 65 von 91.
Während nullable Typen es dir ermöglichen, einen Typ oder null zu akzeptieren, erlauben Union-Typen (PHP 8.0+), dass ein Parameter oder Rückgabewert mehrere verschiedene Typen akzeptiert. Verwende den senkrechten Strich |, um die zulässigen Typen zu trennen:
<?php
class Formatter {
public function format(int|float $number): string {
return number_format($number, 2);
}
}
$formatter = new Formatter();
echo $formatter->format(42) . "\n";
echo $formatter->format(3.14159);
Ausgabe:
42.00
3.14Union-Typen sind besonders nützlich, wenn eine Methode mit verschiedenen, aber verwandten Typen arbeiten kann. Du kannst so viele Typen wie nötig kombinieren, einschließlich Klassennamen und Schnittstellen:
<?php
class Logger {
public function log(string|array|Stringable $message): void {
if (is_array($message)) {
$message = implode(", ", $message);
}
echo "Log: $message";
}
}
Schnittmengentypen (PHP 8.1+) sind das Gegenteil – sie erfordern, dass ein Wert alle angegebenen Typen gleichzeitig implementiert. Verwende das kaufmännische Und &, um sie zu kombinieren:
<?php
interface Printable {
public function print(): string;
}
interface Saveable {
public function save(): void;
}
class DocumentHandler {
public function process(Printable&Saveable $doc): void {
echo $doc->print();
$doc->save();
}
}
Hier akzeptiert process() nur Objekte, die sowohl Printable als auch Saveable implementieren. Dadurch wird sichergestellt, dass das Objekt über alle erforderlichen Fähigkeiten verfügt, bevor die Methode ausgeführt wird, wodurch dein Code sicherer und ausdrucksstärker wird.
Aufgabe
EinfachErstellen wir einen Datenprozessor, der sowohl Vereinigungstypen als auch Schnittmengentypen demonstriert. Du erstellst ein System, das mehrere Eingabeformate verarbeiten kann und für bestimmte Vorgänge erfordert, dass Objekte mehrere Schnittstellen implementieren.
Du organisierst deinen Code über drei Dateien:
Interfaces.php: Definiere zwei Schnittstellen, die unterschiedliche Fähigkeiten darstellen:Exportablemit einer Methodeexport(): stringLoggablemit einer Methodelog(): string
DataProcessor.php: Erstelle eineDataProcessor-Klasse, die sowohl Vereinigungs- als auch Schnittmengentypen veranschaulicht. Binde die Interfaces-Datei ein. Deine Klasse sollte Folgendes enthalten:- Eine Methode
normalize(int|float|string $value): string, die jeden dieser Typen in einen String umwandelt. Formatiere Zahlen mit 2 Dezimalstellen. Gib Strings unverändert zurück. - Eine Methode
processMultiple(array $values): string, die ein Array mit gemischten Werten (Ganzzahlen, Gleitkommazahlen oder Strings) akzeptiert, jeden Wert mithilfe der obigen Methode normalisiert und die Werte mit" | "verbunden zurückgibt - Eine Methode
handleDocument(Exportable&Loggable $doc): string, die einen Schnittmengentyp verwendet, um ein Objekt zu verlangen, das beide Schnittstellen implementiert. Sie soll das Ergebnis des Aufrufs vonlog(), gefolgt von" -> "und anschließend dem Ergebnis vonexport(), zurückgeben
- Eine Methode
main.php: Binde die DataProcessor-Datei ein. Du erhältst zwei Eingaben: einen Typindikator ("int","float"oder"string") und einen Wert.Erstelle einen
DataProcessorund wandle den Eingabewert anhand des Indikators in den entsprechenden Typ um. Rufe anschließendnormalize()mit diesem Wert auf und gib das Ergebnis aus.Erstelle danach eine anonyme Klasse, die sowohl
Exportableals auchLoggableimplementiert. Die Methodeexport()soll"Exported data"zurückgeben und die Methodelog()soll"Logged"zurückgeben. Übergib dieses Objekt anhandleDocument()und gib das Ergebnis in einer neuen Zeile aus.
Diese Herausforderung kombiniert Vereinigungstypen für eine flexible Eingabeverarbeitung mit Schnittmengentypen, um sicherzustellen, dass Objekte mehrere erforderliche Fähigkeiten besitzen: beides sind leistungsstarke Funktionen zum Erstellen robuster, typsicherer PHP-Anwendungen.
Probier es selbst
<?php
require_once 'DataProcessor.php';
// Eingabe lesen
$type = trim(fgets(STDIN));
$value = trim(fgets(STDIN));
// TODO: Erstelle eine DataProcessor-Instanz
// TODO: Konvertiere $value in den entsprechenden Typ basierend auf dem $type-Indikator
// ("int", "float" oder "string")
// TODO: Rufe normalize() mit dem konvertierten Wert auf und gib das Ergebnis aus
// TODO: Erstelle eine anonyme Klasse, die sowohl Exportable als auch Loggable implementiert
// - export() should return "Exported data"
// - log() sollte "Logged" zurückgeben
// TODO: Übergebe die Instanz der anonymen Klasse an handleDocument() und gib das Ergebnis 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