web-dev-qa-db-fra.com

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

En utilisant la classe DateTime, si j'essaie d'exécuter le code suivant:

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

Je récupérerai ce message d'erreur

Remarque: propriété non définie: DateTime :: $ date ...

Ce qui n'a pas de sens car lors de l'exécution de 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.

80
okey_on

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

La date de disponibilité est en fait un effet secondaire de la prise en charge de var_dump() ici - [email protected]

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

echo $mydate->format('Y-m-d H:i:s');
137
jeremy

En plus d'utiliser 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));

Ceci est légèrement plus rapide que l'utilisation de format() car format() formate une horodatage 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 bug a déjà été déposé en tant que @Nile mentionné dans les commentaires ci-dessus.

14
hek2mgl

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

$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 la propriété existe même pour l'objet. Je ne peux pas comprendre ce comportement. Il suffit de commenter le var_Dump et vous obtiendrez à nouveau l'erreur.

1
Sascha

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

Vous pouvez afficher la date avec la fonction de formatage.

<?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) {
}
1
filipe

Comme indiqué par les autres réponses, c'est un problème avec PHP qui n'est pas résolu à ce jour mais si c'est un "effet secondaire" de 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 DateTime étaient censées être utilisées par nous, elles auraient été rendues disponibles. Mais comme beaucoup de classes internes, ce ne sont pas pas et vous ne devriez pas vous fier aux 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 découvrez comment var_dump() crée une fausse sortie d'un objet jetez un oeil à __debugInfo()

1
Xorifelse