Pourquoi ne puis-je pas accéder à DateTime-> date dans la classe DateTime de PHP?

94

En utilisant la DateTimeclasse, si j'essaye d'exécuter le code suivant:

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

Je vais récupérer ce message d'erreur

Avis: Propriété non définie: DateTime :: $ date ...

Ce qui n'a pas de sens car lors de l'exécution var_dump()sur la variable $mydate, cela montre clairement que cette propriété existe et est accessible au public:

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)

Est-ce un bug dans PHP ou est-ce que je fais quelque chose de mal? J'utilise PHP 5.4.3.

okey_on
la source
1
Bonne question. J'ai pensé un instant que je ne comprenais ... rien.
regularmike

Réponses:

146

Il s'agit d'un problème connu .

La date de disponibilité est en fait un effet secondaire du support pour var_dump()ici - [email protected]

Pour une raison quelconque, vous n'êtes pas censé pouvoir accéder à la propriété, mais la var_dumpmontre quand même. Si vous voulez vraiment obtenir la date dans ce format, utilisez la DateTime::format()fonction.

echo $mydate->format('Y-m-d H:i:s');
Jeremy
la source
1
Pourquoi ne voudrait-on pas ce format exact? C'est le même format que MySQL pour les dates.
Elia Iliashenko
@HelgaIliashenko Je ne suis pas sûr de comprendre. Je n'ai jamais dit qu'on ne voudrait pas de ce format exact.
jeremy
C'est la même chose si vous utilisez var_dump ou print_r.
AndyGaskell
15

En plus d'appeler, DateTime::format()vous pouvez accéder à la propriété en utilisant la réflexion:

<?php

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

C'est un peu plus rapide que l'utilisation format()car format()formate une chaîne temporelle qui a déjà été formatée. Surtout si vous le faites plusieurs fois en boucle.

Cependant, ce n'est pas un comportement régulier de PHP. Un rapport de bogue a déjà été déposé sous le nom @Nile mentionné dans les commentaires ci-dessus.

hek2mgl
la source
2

Comme indiqué par les autres réponses, c'est un problème avec PHP qui n'est pas résolu à ce jour, mais s'il s'agit d'un «effet secondaire», var_dump()je ne suis pas si sûr.

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

Ce dont je suis sûr, c'est que si les propriétés de l' DateTimeendroit où nous voulions être utilisées, elles auraient été rendues disponibles. Mais comme beaucoup de classes internes, elles ne le sont pas et vous ne devriez pas vous fier à des méthodes «hacky» ou «glitchy» pour corriger votre code. Au lieu de cela, vous devez utiliser leur API .

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

Si vous n'êtes pas satisfait, vous pouvez étendre la classe ou peut-être utiliser Carbon qui l'étend pour vous.

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

Si vous savez comment var_dump()créer une fausse sortie d'un objet, jetez un œil à__debugInfo()

Xorifelse
la source
2

La propriété date de DateTime est protégée.

Vous pouvez afficher la date avec la fonction de format.

<?php

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

Ou vous pouvez convertir en tableau:

<?php

try {
    $time = (array) new DateTime();
    var_dump($time["date"]);
} catch (Exception $e) {
}
filipe
la source
Il voulait savoir pourquoi il ne pouvait pas accéder à la propriété date de l'objet DateTime ... Où voyez-vous qu'il voulait formater une valeur Datetime stockée? "Ymd H: i: s" est le format dans lequel la date est par défaut!
filipe
La conversion d'objet en tableau - comme vous le suggérez - est probablement le moyen le plus simple.
Jeffz
0

Si vous utilisez simplement un var_Dump avant de demander la date de propriété, tout fonctionne correctement:

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

Cela offre:

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

Vous voyez donc que la date de propriété existe même pour l'objet. Je ne comprends pas ce comportement. Mettez simplement en commentaire le var_Dump et vous obtiendrez à nouveau l'erreur.

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