• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

[ERLEDIGT] Klasse extends DateTime - CreateFromFormat Bug?

CGollhardt

Mitglied
Hallo,

folgendes kleines Demo Projekt:

PHP:
<?php
namespace Example;
class Foo extends \DateTime {
    static function Get($date) {
        return self::createFromFormat('d.m.Y', $date);
    }
}
$bar = Foo::Get('20.06.2013');
echo get_class($bar);
//Ausgabe: DateTime
//Erwartet: Foo
?>

Wie bereits im Kommentar geschrieben, erfolgt die Ausgabe "DateTime". Ich erwarte allerdings "Foo".

Woran liegt das? Wie kann man dies umgehen?

Habe mir jetzt folgende Lösung überlegt:
PHP:
        $dateTime = new CustomDateTime();

        //Todo: Besseren Weg finden, auskommentierte Zeile funktioniert nicht. Bug???
        //$dateTime = self::createFromFormat($format, $str);
        $tempDateTime = \DateTime::createFromFormat($format, $str);
        if ($tempDateTime !== false) {
            $dateTime->setTimestamp($tempDateTime->getTimestamp());
        }
        return $dateTime;

Aber hier werden ja alle Benifits des DateTime objektes verworfen, weil eine Convertierung über den UnixTimestamp erfolgt.

Gibt es eine elegantere Lösung?
 
Werbung:
Hm. Ich fürchte nicht wirklich. Aber vielleicht mal anders gefragt: Warum erweiterst du DateTime?
 
Warum erweiterst du DateTime?

Danke für deine Antwort.

Der Grund war bzw. ist, dass ich "als Entwickler" relativ "simple" standardmäßige Aufgaben anhand eines Objektes durchführen kann, ohne jedes mal eine Funktion/Methode aufrufen zu müssen, oder mit verschiedenen Objekten hin und her spielen möchte.

Also Beispielsweise folgende (Helper-) Methoden

PHP:
$myobject->ToSqlDate();
$myobject->ToSqlDateTime();
$myobject->ToDisplayDate(); //TimeFormat des aktuellen Viewers benutzen
$myobject->ToDisplayTime(); //TimeZone des aktuellen Viewers benutzen
$myobject->GetDay();
$myobject->GetMonth();
//...
$myobject->GetCountdown($targetDateTime);
$myobject->GetDifference($targetDateTime);
//...
$myobject = DateTime::GetBySqlDate($sqlDate);
$myobject = DateTime::GetBySqlDateTime($sqlDateTime);
//....

Würde sicherlich auch anders gehen, aber ich würde dies sehr komfortabel finden.
 
Zuletzt bearbeitet:
Werbung:
Mhm. Würde ich vielleicht nicht mit Vererbung machen, sondern mit einer Extraklasse, die mit DateTime-Objekten arbeitet.

PHP:
$sqlDate = $myobject->ToSqlDate($datetime);
$datetime = MyObject::GetBySqlDate($sqlDate);
 
Zurück
Oben