Почему я не могу получить доступ к DateTime-> date в классе PHP DateTime?

95

Используя DateTimeкласс, если я попытаюсь запустить следующий код:

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

Я верну это сообщение об ошибке

Примечание: Неопределенное свойство: DateTime :: $ date ...

Что не имеет смысла, потому что при работе var_dump()с переменной $mydateясно видно, что это свойство существует и общедоступно:

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)

Это ошибка PHP или я что-то делаю не так? Я использую PHP 5.4.3.

okey_on
источник
1
Хороший вопрос. На мгновение я подумал, что не понимаю ... ничего.
regularmike

Ответы:

148

Это известная проблема .

Дата доступности на самом деле является побочным эффектом поддержки var_dump()здесь - derick@php.net

По какой-то причине у вас не должно быть доступа к объекту, но var_dumpон все равно отображается. Если вы действительно хотите получить дату в этом формате, используйте DateTime::format()функцию.

echo $mydate->format('Y-m-d H:i:s');
Джереми
источник
1
Почему не нужен именно этот формат? Это тот же формат, что и в MySQL для дат.
Элия ​​Ильяшенко
@HelgaIliashenko Не уверен, что понимаю. Я никогда не говорил, что никто не захочет именно этот формат.
Джереми
То же самое при использовании var_dump или print_r.
AndyGaskell
15

Помимо вызова DateTime::format()вы можете получить доступ к свойству с помощью отражения:

<?php

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

Это немного быстрее, чем использование, format()потому format()что форматирует уже отформатированную временную строку. Особенно, если вы делаете это много раз подряд.

Однако это не обычное поведение PHP. Сообщение об ошибке уже было отправлено как @Nile, упомянутый в комментариях выше.

hek2mgl
источник
2

Как отмечается в других ответах, это проблема с PHP, которая на сегодняшний день не решена, но если это «побочный эффект», var_dump()я не уверен ..

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

В чем я уверен, так это в том, что если бы свойства объекта DateTimewhere предназначались для использования нами, они были бы доступны. Но, как и многие внутренние классы, это не так, и вам не следует полагаться на «хакерские» или «глючные» методы для исправления кода. Вместо этого вы должны использовать их API .

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

Если вы не удовлетворены, вы можете расширить класс или, возможно, использовать Carbon, который расширяет его за вас.

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

Если вам интересно, как var_dump()создается фальшивый вывод объекта, взгляните на__debugInfo()

Xorifelse
источник
2

Свойство date DateTime защищено.

Вы можете отображать дату с функцией форматирования.

<?php

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

Или вы можете преобразовать в массив:

<?php

try {
    $time = (array) new DateTime();
    var_dump($time["date"]);
} catch (Exception $e) {
}
филипп
источник
Он хотел знать, почему он не может получить доступ к свойству date объекта DateTime ... Где вы видите, он хотел отформатировать сохраненные значения Datetime? "Ymd H: i: s" - это формат даты по умолчанию!
filipe
Преобразование объекта в массив - как вы предлагаете - вероятно, самый простой способ.
Джеффз
0

Если вы просто используете var_Dump перед тем, как спросить дату свойства, все работает нормально:

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

Это обеспечивает:

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

Итак, вы видите, что дата собственности существует даже для объекта. Я не могу понять этого поведения. Просто закомментируйте var_Dump, и вы снова получите ошибку.

Саша
источник
error_reporting (0); эхо-дата ("Ymd H: i: s", strtotime ($ mydate-> date));
Кошик Дас