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

Используя класс 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.

Ответ 1

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

Дата, доступная на самом деле, является побочным эффектом поддержки var_dump() здесь - [email protected]

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

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

Ответ 2

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

<?php

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

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

Однако это не регулярное поведение PHP. Bugreport уже зарегистрирован как @Nile, упомянутый в комментариях выше.

Ответ 3

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

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

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

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

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

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

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

Ответ 4

Если вы просто используете 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, и вы снова получите ошибку.

Ответ 5

Свойство 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) {
}