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 DoeNullable 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 foundDie 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.
Aufgabe
EinfachLass 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 eineContact-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äßignull) - Füge eine nullable String-Eigenschaft
$emailhinzu, die mitnullinitialisiert 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
- Verwende Constructor Promotion für ein erforderliches
ContactBook.php: Erstelle eineContactBook-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): voidbesitzen, die einen Kontakt zur Sammlung hinzufügt - Eine Methode
findByName(string $name): ?Contactbesitzen, die nach einem Kontakt mit exakt übereinstimmendem Namen sucht und den Kontakt zurückgibt, wenn er gefunden wurde, odernull, 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 neuenContacthinzu. Wenn die Telefoneingabe"none"lautet, übergibnullals 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"
?>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