Menu
CoddyTech

Nullable-Typen

Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy. Lektion 64 von 91.

Manchmal kann ein Wert tatsächlich nicht vorhanden sein. Ein Benutzer hat möglicherweise keinen zweiten Vornamen, oder eine Suche liefert möglicherweise keine Ergebnisse. Mit nullable Typen kannst du ausdrücklich deklarieren, dass ein Parameter, Rückgabewert oder eine Eigenschaft entweder einen bestimmten Typ oder null haben kann.

Füge ein Fragezeichen ? vor dem Typ hinzu, um ihn nullable zu machen:

<?php
class User {
    public ?string $middleName = null;
    
    public function __construct(
        public string $firstName,
        public string $lastName
    ) {}
    
    public function getFullName(): string {
        if ($this->middleName !== null) {
            return "$this->firstName $this->middleName $this->lastName";
        }
        return "$this->firstName $this->lastName";
    }
}

$user = new User("John", "Doe");
echo $user->getFullName();

Ausgabe:

John Doe

Nullable Rückgabetypen funktionieren genauso. Das ist nützlich, wenn eine Methode möglicherweise nicht findet, wonach sie sucht:

<?php
class UserRepository {
    private array $users = [];
    
    public function find(int $id): ?User {
        return $this->users[$id] ?? null;
    }
}

$repo = new UserRepository();
$user = $repo->find(1);
echo $user === null ? "Not found" : $user->firstName;

Ausgabe:

Not found

Die Verwendung von nullable Typen macht die Absicht deines Codes klar. Wenn du ?string siehst, weißt du sofort, dass null ein gültiger Wert ist und behandelt werden sollte. Ohne das Fragezeichen würde die Übergabe von null einen Typfehler verursachen.

challenge icon

Aufgabe

Einfach

Lass uns ein Kontaktverwaltungssystem erstellen, das optionale Informationen mithilfe von Nullable-Typen zuverlässig verarbeitet. Nicht jeder gibt alle seine Daten an, daher muss dein System fehlende Daten elegant verarbeiten können.

Du organisierst deinen Code auf drei Dateien:

  • Contact.php: Erstelle eine Contact-Klasse, die eine Person in deiner Kontaktliste repräsentiert. Einige Informationen sind erforderlich, andere Details sind optional:
    • Verwende Constructor Promotion für ein erforderliches $name (String) und ein optionales $phone (nullable String, standardmäßig null)
    • Füge eine nullable String-Eigenschaft $email hinzu, die mit null initialisiert wird
    • Erstelle eine Methode setEmail(?string $email): void, die die E-Mail-Eigenschaft setzt
    • Erstelle eine Methode getContactInfo(): string, die die Kontaktinformationen in folgendem Format zurückgibt: "Name: [name]", gefolgt von " | Phone: [phone]", nur wenn das Telefon nicht null ist, gefolgt von " | Email: [email]", nur wenn die E-Mail nicht null ist
  • ContactBook.php: Erstelle eine ContactBook-Klasse, die Kontakte speichert und durchsucht. Binde die Contact-Datei ein. Die Klasse soll:
    • Ein privates Array zum Speichern von Kontakten besitzen
    • Eine Methode addContact(Contact $contact): void besitzen, die einen Kontakt zur Sammlung hinzufügt
    • Eine Methode findByName(string $name): ?Contact besitzen, die nach einem Kontakt mit exakt übereinstimmendem Namen sucht und den Kontakt zurückgibt, wenn er gefunden wurde, oder null, wenn er nicht gefunden wurde
  • main.php: Binde die ContactBook-Datei ein. Du erhältst drei Eingaben: einen hinzuzufügenden Namen, eine Telefonnummer (oder den String "none", wenn keine Telefonnummer vorhanden ist) und einen Namen, nach dem gesucht werden soll.

    Erstelle eine ContactBook-Instanz und füge mithilfe der ersten beiden Eingaben einen neuen Contact hinzu. Wenn die Telefoneingabe "none" lautet, übergib null als Telefonnummer.

    Suche anschließend mithilfe der dritten Eingabe nach einem Kontakt. Wenn er gefunden wurde, gib die Kontaktinformationen mit getContactInfo() aus. Wenn er nicht gefunden wurde, gib "Contact not found" aus.

Diese Aufgabe zeigt, wie Nullable-Typen die Absicht deines Codes verdeutlichen: Wenn du ?string für das Telefon oder die E-Mail siehst, weißt du sofort, dass diese Felder optional sind und möglicherweise keinen Wert haben.

Probier es selbst

<?php

require_once 'ContactBook.php';

// Eingaben lesen
$nameToAdd = trim(fgets(STDIN));
$phoneInput = trim(fgets(STDIN));
$nameToSearch = trim(fgets(STDIN));

// TODO: Erstelle eine ContactBook-Instanz

// TODO: Bestimme den Telefonwert (null, wenn die Eingabe "none" ist, ansonsten die Eingabe verwenden)

// TODO: Erstelle einen neuen Contact mit dem Namen und der Telefonnummer

// TODO: Füge den Kontakt zum ContactBook hinzu

// TODO: Suche nach einem Kontakt mit nameToSearch

// TODO: Wenn gefunden, gib die Infos des Kontakts mit getContactInfo() aus
// TODO: If not found, print "Contact not found"

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