Menu
CoddyTech

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.14

Union-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.

challenge icon

Aufgabe

Einfach

Erstellen 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:
    • Exportable mit einer Methode export(): string
    • Loggable mit einer Methode log(): string
  • DataProcessor.php: Erstelle eine DataProcessor-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 von log(), gefolgt von " -> " und anschließend dem Ergebnis von export(), zurückgeben
  • main.php: Binde die DataProcessor-Datei ein. Du erhältst zwei Eingaben: einen Typindikator ("int", "float" oder "string") und einen Wert.

    Erstelle einen DataProcessor und wandle den Eingabewert anhand des Indikators in den entsprechenden Typ um. Rufe anschließend normalize() mit diesem Wert auf und gib das Ergebnis aus.

    Erstelle danach eine anonyme Klasse, die sowohl Exportable als auch Loggable implementiert. Die Methode export() soll "Exported data" zurückgeben und die Methode log() soll "Logged" zurückgeben. Übergib dieses Objekt an handleDocument() 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


?>
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-PHP-Compiler