Start · Sprachen · PHP · Referenz · DateObjectError

DateObjectError

Klasse

Wird geworfen, wenn eine der Datum/Uhrzeit-Klassen (z. B. <code>DateTime</code>, <code>DateTimeImmutable</code>) nicht korrekt initialisiert wurde.

seit PHP 8.3.0 Kategorie: error

Signatur

class DateObjectError extends Error

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();
}
DateObjectError abgefangen: Object of type BrokenDate has not been correctly initialized by calling parent::__construct() in its constructor.

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;
}
Ungültiges Datumsobjekt: Object of type DateTime has not been correctly initialized by calling parent::__construct() in its constructor.

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