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

Lesezeit: 4 Minuten

Warum kann ich in der DateTime Klasse von PHP nicht auf
okey_on

Verwendung der DateTime Klasse, wenn ich versuche, den folgenden Code auszuführen:

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

Ich bekomme diese Fehlermeldung zurück

Hinweis: Undefinierte Eigenschaft: DateTime::$date…

Was keinen Sinn macht, denn beim Laufen var_dump() auf der Variable $mydatezeigt es deutlich, dass diese Eigenschaft existiert 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 verwende PHP 5.4.3.

  • Gute Frage. Ich dachte für einen Moment, ich hätte nichts verstanden.

    – normales Mikrofon

    15. Oktober 2015 um 16:59 Uhr

1646881447 234 Warum kann ich in der DateTime Klasse von PHP nicht auf
jeremy

Das 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 sollen Sie aber nicht auf das Grundstück zugreifen können var_dump zeigt es trotzdem. 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');

  • Warum sollte man nicht genau dieses Format wollen? Es ist dasselbe Format wie MySQL für Datumsangaben.

    – Megan Caithlyn

    16. Juli 2015 um 16:51 Uhr

  • Dies ist dasselbe, wenn Sie var_dump oder print_r verwenden.

    – Andy Gaskell

    24. April 2019 um 10:44 Uhr

Warum kann ich in der DateTime Klasse von PHP nicht auf
hek2mgl

Update: Das Verhalten hat sich in PHP7.3 geändert, die ursprüngliche Antwort funktioniert nicht mehr. Um mit allen PHP-Versionen die gleichen Ergebnisse zu erhalten, inkl. >=7.3 können Sie den folgenden Code verwenden:

$dt = new DateTime();
$date = $dt->format('Y-m-d\TH:i:s.v');

Fürs Protokoll, die ursprüngliche Antwort:

Außer zu telefonieren DateTime::format() Sie können mit Reflektion 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() formatiert einen bereits formatierten Zeitstring. Vor allem, wenn Sie es viele Male in einer Schleife tun.

Dies ist jedoch kein dokumentiertes Verhalten von PHP, es kann sich jederzeit ändern.

  • Wie funktioniert das nicht mehr in PHP 7.4? 7.2-Version sandbox.onlinephpfunctions.com/code/… 7.4 – Fehler sandbox.onlinephpfunctions.com/code/…

    – TechCare99

    18. November 2020 um 15:27 Uhr

  • @TechCare99 🙂 Ich denke, es sollte niemals so funktionieren, es war ein Hack. Sie müssen 7.4 nach einer Alternative suchen, die heutzutage nicht viel PHP macht, aber ich werde es überprüfen. Danke für die Information!

    – hek2mgl

    18. November 2020 um 15:28 Uhr


  • Aktualisiert, um damit zu arbeiten alle PHP-Versionen

    – hek2mgl

    22. November 2020 um 22:38 Uhr


1646881449 989 Warum kann ich in der DateTime Klasse von PHP nicht auf
Xorifelse

Wie in den anderen Antworten erwähnt, handelt es sich um ein Problem mit PHP, das bis heute ungelöst ist, aber wenn es sich um eine „Nebenwirkung“ handelt var_dump() Ich bin nicht sicher..

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

Worüber ich mir sicher bin, ist das wenn die Eigenschaften von DateTime wo es von uns verwendet werden sollte, wäre es zur Verfügung gestellt worden. 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 verwenden API.

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

Wenn Sie nicht zufrieden sind, können Sie die Klasse verlängern oder vielleicht verwenden Kohlenstoff das erweitert es für Sie.

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

Wenn Sie sich fragen, wie var_dump() erstellt eine gefälschte Ausgabe eines Objekts, das Sie sich ansehen __debugInfo()

Die date-Eigenschaft von DateTime ist geschützt.

Sie können das Datum mit der Formatfunktion 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) {
}

Wenn Sie nur eine verwenden var_Dump Bevor Sie das Objektdatum fragen, funktioniert alles gut:

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

Das 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 sogar für das Objekt existiert. Ich kann dieses Verhalten nicht verstehen. Kommentieren Sie einfach den var_Dump aus und Sie erhalten den Fehler erneut.

  • error_reporting(0); echo date(“Ymd H:i:s”,strtotime($mydate->date));

    – Kaushik Das

    24. August 2017 um 13:55 Uhr


  • Nein, das tut es nicht, schon gar nicht in php7, wirft a Notice: Undefined property: DateTime::$date

    – Grant G

    12. Januar 2021 um 11:16 Uhr

  • error_reporting(0); echo date(“Ymd H:i:s”,strtotime($mydate->date));

    – Kaushik Das

    24. August 2017 um 13:55 Uhr


  • Nein, das tut es nicht, schon gar nicht in php7, wirft a Notice: Undefined property: DateTime::$date

    – Grant G

    12. Januar 2021 um 11:16 Uhr

985820cookie-checkWarum kann ich in der DateTime-Klasse von PHP nicht auf DateTime->date zugreifen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy