Exception-Klassen
Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy — Lektion 66 von 91.
In PHP sind Exceptions Objekte, die verwendet werden, um zu signalisieren, dass während der Ausführung etwas schiefgelaufen ist. Die Basisklasse für alle Exceptions ist Exception, und das Verständnis ihrer Struktur hilft Ihnen, Fehler in Ihren OOP-Anwendungen effektiv zu handhaben.
Wenn Sie eine Exception werfen, erstellen Sie eine Instanz der Exception-Klasse (oder einer Unterklasse) mit einer Nachricht, die beschreibt, was schiefgelaufen ist:
<?php
class BankAccount {
public function __construct(private float $balance = 0) {}
public function withdraw(float $amount): float {
if ($amount > $this->balance) {
throw new Exception("Insufficient funds");
}
$this->balance -= $amount;
return $amount;
}
}
$account = new BankAccount(100);
$account->withdraw(150);
Dies würde einen Fehler aufgrund einer nicht abgefangenen Exception mit der Nachricht "Insufficient funds" erzeugen.
PHP bietet mehrere integrierte Exception-Klassen für verschiedene Situationen. InvalidArgumentException signalisiert eine fehlerhafte Eingabe, RuntimeException weist auf Fehler während der Ausführung hin und LogicException repräsentiert Programmierfehler:
<?php
class Calculator {
public function divide(int $a, int $b): float {
if ($b === 0) {
throw new InvalidArgumentException("Cannot divide by zero");
}
return $a / $b;
}
}
Jedes Exception-Objekt enthält nützliche Informationen: getMessage() gibt die Fehlermeldung zurück, getCode() gibt einen optionalen Fehlercode zurück, getFile() und getLine() teilen Ihnen mit, wo die Exception ausgelöst wurde. Die Verwendung spezifischer Exception-Typen macht die Absicht Ihres Codes klarer und ermöglicht eine präzisere Fehlerbehandlung.
Aufgabe
EinfachLassen Sie uns ein Bestandsverwaltungssystem aufbauen, das die in PHP integrierten Exception-Klassen verwendet, um verschiedene Arten von Problemen zu signalisieren. Sie werden ein Produktinventar erstellen, bei dem Operationen auf spezifische, aussagekräftige Weise fehlschlagen können.
Sie werden Ihren Code über drei Dateien hinweg organisieren:
Product.php— Erstellen Sie eineProduct-Klasse, die einen Artikel im Inventar darstellt. Verwenden Sie Constructor Promotion für ein öffentliches$sku(string), ein öffentliches$name(string) und ein privates$quantity(int). Ihre Klasse sollte Folgendes haben:- Eine Methode
getQuantity(): int, die die aktuelle Menge zurückgibt - Eine Methode
addStock(int $amount): void, die die Menge erhöht. Wenn der Betrag kleiner als 1 ist, werfen Sie eineInvalidArgumentExceptionmit der Nachricht"Amount must be positive" - Eine Methode
removeStock(int $amount): void, die die Menge verringert. Wenn der Betrag kleiner als 1 ist, werfen Sie eineInvalidArgumentExceptionmit der Nachricht"Amount must be positive". Wenn der Betrag die aktuelle Menge übersteigt, werfen Sie eineRuntimeExceptionmit der Nachricht"Insufficient stock"
- Eine Methode
Inventory.php— Erstellen Sie eineInventory-Klasse, die eine Sammlung von Produkten verwaltet. Binden Sie die Product-Datei ein. Ihre Klasse sollte Folgendes haben:- Ein privates Array zum Speichern von Produkten, indiziert nach SKU
- Eine Methode
addProduct(Product $product): void, die ein Produkt hinzufügt. Wenn ein Produkt mit derselben SKU bereits existiert, werfen Sie eineLogicExceptionmit der Nachricht"Product already exists: [sku]" - Eine Methode
getProduct(string $sku): Product, die ein Produkt anhand der SKU zurückgibt. Wenn es nicht gefunden wird, werfen Sie eineInvalidArgumentExceptionmit der Nachricht"Product not found: [sku]"
main.php— Binden Sie die Inventory-Datei ein. Sie erhalten drei Eingaben: eine SKU, einen Produktnamen und eine Operation ("add","remove"oder"duplicate").Erstellen Sie ein
Inventoryund fügen Sie ein neuesProductmit der angegebenen SKU, dem Namen und einer Anfangsmenge von10hinzu.Basierend auf der Operation:
"add": Rufen SieaddStock(5)für das Produkt auf und geben Sie dann"Stock updated: [quantity]"aus"remove": Rufen SieremoveStock(15)für das Produkt auf (dies sollte eine Exception auslösen)"duplicate": Versuchen Sie, ein weiteres Produkt mit derselben SKU hinzuzufügen (dies sollte eine Exception auslösen)
Wenn eine Exception ausgelöst wird, geben Sie den Klassennamen der Exception gefolgt von
": "und der Nachricht der Exception aus. Verwenden Sie die PHP-Funktionget_class(), um den Klassennamen zu erhalten.
Diese Herausforderung zeigt, wie verschiedene Exception-Typen unterschiedliche Arten von Problemen kommunizieren — ungültige Eingaben, Laufzeitfehler und Logikfehler — wodurch die Fehlerbehandlung Ihres Codes präziser und aussagekräftiger wird.
Spickzettel
In PHP sind Exceptions (Ausnahmen) Objekte, die Fehler während der Ausführung signalisieren. Die Basisklasse ist Exception.
Um eine Exception auszulösen, erstellen Sie eine Instanz mit einer beschreibenden Nachricht:
<?php
class BankAccount {
public function __construct(private float $balance = 0) {}
public function withdraw(float $amount): float {
if ($amount > $this->balance) {
throw new Exception("Insufficient funds");
}
$this->balance -= $amount;
return $amount;
}
}
PHP bietet integrierte Exception-Klassen für verschiedene Situationen an:
InvalidArgumentException— signalisiert ungültige EingabenRuntimeException— weist auf Fehler während der Ausführung hinLogicException— repräsentiert Programmierfehler
<?php
class Calculator {
public function divide(int $a, int $b): float {
if ($b === 0) {
throw new InvalidArgumentException("Cannot divide by zero");
}
return $a / $b;
}
}
Exception-Objekte bieten nützliche Methoden:
getMessage()— gibt die Fehlermeldung zurückgetCode()— gibt einen optionalen Fehlercode zurückgetFile()— gibt die Datei zurück, in der die Exception ausgelöst wurdegetLine()— gibt die Zeilennummer zurück, in der die Exception ausgelöst wurde
Verwenden Sie get_class(), um den Klassennamen eines Exception-Objekts abzurufen.
Probier es selbst
<?php
require_once 'Inventory.php';
// Eingaben lesen
$sku = trim(fgets(STDIN));
$name = trim(fgets(STDIN));
$operation = trim(fgets(STDIN));
try {
// TODO: Ein Inventar erstellen
// TODO: Ein Produkt mit der angegebenen SKU, dem Namen und einer Anfangsmenge von 10 erstellen
// TODO: Das Produkt zum Inventar hinzufügen
// TODO: Basierend auf der Operation:
// - "add": addStock(5) für das Produkt aufrufen, dann "Stock updated: [quantity]" ausgeben
// - "remove": removeStock(15) für das Produkt aufrufen
// - "duplicate": Versuchen, ein weiteres Produkt mit derselben SKU hinzuzufügen
} catch (Exception $e) {
// TODO: Den Namen der Exception-Klasse gefolgt von ": " und der Nachricht ausgeben
// Hinweis: get_class($e) verwenden, um den Klassennamen zu erhalten
}
?>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 die OOPKlassen vs. ObjekteDas $this-SchlüsselwortMethodenEigenschaftenKonstruktor (__construct)Destruktor (__destruct)Rückblick - Einfacher Taschenrechner4Vererbung
Grundlagen der VererbungDas parent:: SchlüsselwortMethoden überschreibenDas final SchlüsselwortAbstrakte KlassenZusammenfassung – Mitarbeiter-Hierarchie7Kapselung
Public, Protected, PrivateZugriffsmodifikatoren im DetailGetter und SetterInformation HidingConstructor Promotion (8.0)Zusammenfassung – Studentenverwaltungssystem2Namensräume & Autoloading
Einführung in NamensräumeDas use-SchlüsselwortPSR-4 Autoloading-StandardComposer AutoloaderZusammenfassung – Organisiertes Projekt5Interfaces & Verträge
Einführung in InterfacesInterfaces implementierenMehrfache Interface-ImplementierungInterface vs. Abstrakte KlasseType Hinting mit InterfacesZusammenfassung – Formen-Rechner8Magische Methoden
Einführung in magische Methoden__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Objekt-Klonen__serialize & __unserializeZusammenfassung - Eigene Collection11Typsystem & Fehlerbehandlung
TypdeklarationenNullable-TypenUnion- & Intersection-TypenException-KlassenEigene Exception-HierarchieTry, Catch, FinallyZusammenfassung - Formular-Validator14Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen3Klasseneigenschaften
Instanz- vs. statische EigenschaftenKonstanten in KlassenStatische Methoden & EigenschaftenPrivate & geschützte EigenschaftenReadonly-Eigenschaften (PHP 8.1)Zusammenfassung – Bankkonto-Manager6Polymorphismus
Method Overriding erneut betrachtetPolymorphismus über InterfacesType Hinting & Union TypesLate Static BindingZusammenfassung – Payment Processor9Traits
Einführung in TraitsVerwendung mehrerer TraitsKonfliktlösung bei TraitsAbstrakte Methoden in TraitsTraits vs. Vererbung12Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster15Abschlussherausforderungen
E-Learning-PlattformBanksystemSpielcharakter-EntwicklungFahrzeugvermietung