101 votes

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

Utilisation de la DateTime si j'essaie d'exécuter le code suivant :

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

Je reçois ce message d'erreur

Avis : Propriété indéfinie : DateTime::$date...

Ce qui n'a pas de sens car lorsque l'on exécute var_dump() sur la variable $mydate il 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)

S'agit-il d'un bug de PHP ou est-ce que je fais quelque chose de mal ? J'utilise PHP 5.4.3.

159voto

Jeremy Points 4002

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

Le fait que la date soit disponible est en fait un effet secondaire de la prise en charge de la var_dump() ici - derick@php.net

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

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

15voto

hek2mgl Points 38787

Mise à jour : Le comportement a changé en PHP7.3, la réponse originale ne fonctionne plus. Pour obtenir les mêmes résultats avec toutes les versions de PHP, incl. >=7.3, vous pouvez utiliser le code suivant :

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

Pour mémoire, la réponse originale :

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);

Cette méthode est légèrement plus rapide que l'utilisation de format() porque format() formate un timestring qui a déjà été formaté. Surtout si vous le faites plusieurs fois dans une boucle.

Cependant, ce n'est pas un comportement documenté de PHP, il peut changer à tout moment.

2voto

Xorifelse Points 1726

Comme indiqué dans les autres réponses, il s'agit d'un problème avec PHP qui n'est pas résolu à ce jour, mais s'il s'agit d'un "effet secondaire" de l'application 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 était destiné à être utilisé par nous, il aurait été mis à disposition. Mais comme beaucoup de classes internes, elles sont no et vous ne devriez pas vous fier à des méthodes "bricolées" ou "glitchy" pour corriger votre code. Vous devriez plutôt utiliser leurs 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 Carbone qui le prolonge pour vous.

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

Si vous voulez savoir comment var_dump() crée une fausse sortie d'un objet regardez __debugInfo()

2voto

filipe Points 1576

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) {
}

-1voto

Sascha Points 688

Si vous utilisez simplement 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;

Ce qui est fait :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X