Signatur
Beschreibung
DateObjectError ist eine Fehlerklasse, die geworfen wird, wenn eine Methode einer Datum/Uhrzeit-Klasse aufgerufen wird, bevor das zugrundeliegende Objekt ordnungsgemäß initialisiert wurde. Dies kann beispielsweise passieren, wenn ein DateTime-Objekt durch unserialisierung oder Klonen in einen ungültigen Zustand geraten ist.
Die Klasse erbt von Error (nicht von Exception) und gehört damit zur Fehlerhierarchie, die schwerwiegende, nicht wiederherstellbare Probleme repräsentiert. Sie sollte mit einem catch(DateObjectError $e)-Block abgefangen werden, wenn solche Szenarien auftreten können.
Ein typischer Anwendungsfall ist die Absicherung von Code, der mit serialisierten oder geklonten Datumsobjekten arbeitet, um sicherzustellen, dass der interne Zustand des Objekts vor der Nutzung gültig ist.
Da DateObjectError von Error erbt, wird er nicht von einem catch(Exception $e)-Block erfasst. Es muss explizit nach DateObjectError oder Error gefangen werden, oder ein allgemeiner catch(Throwable $e)-Block verwendet werden.
Beispiele
DateObjectError beim Aufruf auf nicht initialisiertem Objekt abfangen
<?php
class BrokenDate extends DateTime
{
public function __construct()
{
// Absichtlich parent::__construct() nicht aufrufen,
// um das Objekt in einem nicht initialisierten Zustand zu lassen
}
}
$date = new BrokenDate();
try {
// Der Aufruf schlägt fehl, da das Objekt nicht initialisiert wurde
echo $date->format('Y-m-d');
} catch (DateObjectError $e) {
echo 'DateObjectError abgefangen: ' . $e->getMessage();
}
Absicherung mit Throwable beim Umgang mit deserialisierten Datumsobjekten
<?php
// Manipulierter serialisierter String, der ein ungültiges DateTime erzeugt
$serialized = 'O:8:"DateTime":0:{}';
try {
$date = unserialize($serialized);
if ($date instanceof DateTime) {
echo $date->format('Y-m-d H:i:s');
}
} catch (DateObjectError $e) {
echo 'Ungültiges Datumsobjekt: ' . $e->getMessage() . PHP_EOL;
} catch (Throwable $e) {
echo 'Allgemeiner Fehler: ' . $e->getMessage() . PHP_EOL;
}
// Wichtig · Fallstricke
Achtung: Da DateObjectError von Error und nicht von Exception erbt, wird es nicht von catch(Exception $e) erfasst. Verwende catch(DateObjectError $e), catch(Error $e) oder catch(Throwable $e), um diesen Fehler zuverlässig abzufangen.
Beim Deserialisieren von Datumsobjekten aus nicht vertrauenswürdigen Quellen sollte stets mit allowed_classes im unserialize()-Aufruf gearbeitet werden, um Sicherheitsrisiken durch das Deserialisieren beliebiger Klassen zu vermeiden.