Warum kann ich in der DateTime-Klasse von PHP nicht auf DateTime-> date zugreifen?

92

Verwenden der DateTimeKlasse, wenn ich versuche, den folgenden Code auszuführen:

$mydate = new DateTime();
echo $mydate->date;

Ich werde diese Fehlermeldung zurückbekommen

Hinweis: Undefinierte Eigenschaft: DateTime :: $ date ...

Dies ist nicht sinnvoll, da beim Ausführen var_dump()der Variablen $mydatedeutlich wird, dass diese Eigenschaft vorhanden und öffentlich zugänglich ist:

var_dump($mydate);

object(DateTime)[1]
  public 'date' => string '2012-12-29 17:19:25' (length=19)
  public 'timezone_type' => int 3
  public 'timezone' => string 'UTC' (length=3)

Ist das ein Fehler in PHP oder mache ich etwas falsch? Ich benutze PHP 5.4.3.

okey_on
quelle
1
Gute Frage. Ich dachte für einen Moment, dass ich ... nichts verstehe.
Regularmike

Antworten:

145

Dies ist ein bekanntes Problem .

Das verfügbare Datum ist eigentlich ein Nebeneffekt der Unterstützung für var_dump()hier - [email protected]

Aus irgendeinem Grund sollten Sie nicht in der Lage sein, auf die var_dumpUnterkunft zuzugreifen, sondern sie trotzdem anzeigen. Wenn Sie das Datum wirklich in diesem Format erhalten möchten, verwenden Sie die DateTime::format()Funktion.

echo $mydate->format('Y-m-d H:i:s');
Jeremy
quelle
1
Warum sollte man nicht genau dieses Format wollen? Es ist das gleiche Format wie MySQL für Datumsangaben.
Elia Iliashenko
@HelgaIliashenko Ich bin nicht sicher, ob ich verstehe. Ich habe nie gesagt, dass man nicht genau dieses Format haben möchte.
Jeremy
Dies ist auch bei Verwendung von var_dump oder print_r der Fall.
AndyGaskell
15

Neben dem Aufruf können DateTime::format()Sie über Reflection auf die Eigenschaft zugreifen:

<?php

$dt = new DateTime();
$o = new ReflectionObject($dt);
$p = $o->getProperty('date');
$date = $p->getValue($dt);

Dies ist etwas schneller als die Verwendung, format()da format()ein Zeitformat formatiert wird, der bereits formatiert wurde. Vor allem, wenn Sie es oft in einer Schleife tun.

Dies ist jedoch kein reguläres Verhalten von PHP. Ein Bugreport wurde bereits als @Nile eingereicht, wie in den obigen Kommentaren erwähnt.

hek2mgl
quelle
2

Wie aus den anderen Antworten hervorgeht, handelt es sich um ein Problem mit PHP, das bis heute ungelöst ist. Wenn es sich jedoch um einen Nebeneffekt handelt, var_dump()bin ich mir nicht so sicher.

echo ((array) new DateTime())['date']; // Works in PHP 7.

Was ich sicher bin , ist , dass , wenn die Eigenschaften von DateTimedenen von uns verwendet werden sollte wäre es verfügbar gemacht wurde. Aber wie viele interne Klassen sind sie es nicht und Sie sollten sich nicht auf "hacky" oder "glitchy" Methoden verlassen, um Ihren Code zu reparieren. Stattdessen sollten Sie ihre API verwenden .

echo (new DateTime())->format('Y-m-d H:i:s');

Wenn Sie nicht zufrieden sind, können Sie die Klasse erweitern oder Carbon verwenden , das sie für Sie erweitert.

echo (new Carbon())->toDateTimeString();

Wenn Sie sich fragen, wie var_dump()eine gefälschte Ausgabe eines Objekts erstellt wird, schauen Sie sich das an__debugInfo()

Xorifelse
quelle
2

Die Datumseigenschaft von DateTime ist geschützt.

Sie können das Datum mit der Formatierungsfunktion anzeigen.

<?php

try {
    $time = new DateTime();
    echo($time->format("Y-m-d H:i:s"));
} catch (Exception $e) {
}

Oder Sie können in ein Array konvertieren:

<?php

try {
    $time = (array) new DateTime();
    var_dump($time["date"]);
} catch (Exception $e) {
}
filipe
quelle
Er wollte wissen, warum er nicht auf die date-Eigenschaft des DateTime-Objekts zugreifen konnte ... Wo sehen Sie, dass er gespeicherte Datetime-Werte formatieren wollte? "Ymd H: i: s" ist das Format, in dem das Datum standardmäßig ist!
Filipe
Die Konvertierung von Objekten in Arrays ist - wie Sie vorschlagen - wahrscheinlich der einfachste Weg.
Jeffz
0

Wenn Sie nur einen var_Dump verwenden, bevor Sie nach dem Datum der Eigenschaft fragen, funktioniert alles in Ordnung:

$mydate = new DateTime();
var_Dump($mydate);
echo '<br>';
echo $mydate->date;

Dies liefert:

object(DateTime)#1 (3) { ["date"]=> string(26) "2017-04-11 08:44:54.000000" ["timezone_type"]=> int(3) ["timezone"]=> string(16) "America/New_York" }
2017-04-11 08:44:54.000000

Sie sehen also, dass das Eigenschaftsdatum auch für das Objekt vorhanden ist. Ich kann dieses Verhalten nicht verstehen. Kommentieren Sie einfach den var_Dump aus und Sie erhalten den Fehler erneut.

Sascha
quelle
error_reporting (0); Echodatum ("Ymd H: i: s", strtotime ($ mydate-> date));
Kaushik Das