Почему я не могу получить доступ к DateTime-> gt; date в 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.

74 голоса | спросил okey_on 29 SatEurope/Moscow2012-12-29T21:35:35+04:00Europe/Moscow12bEurope/MoscowSat, 29 Dec 2012 21:35:35 +0400 2012, 21:35:35

3 ответа


0

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

  

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

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

echo $mydate->format('Y-m-d H:i:s');
ответил jeremy 29 SatEurope/Moscow2012-12-29T21:42:37+04:00Europe/Moscow12bEurope/MoscowSat, 29 Dec 2012 21:42:37 +0400 2012, 21:42:37
0

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

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

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

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

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

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

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

ответил Xorifelse 22 ThuEurope/Moscow2016-12-22T06:26:45+03:00Europe/Moscow12bEurope/MoscowThu, 22 Dec 2016 06:26:45 +0300 2016, 06:26:45
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, и вы снова получите ошибку.

ответил Sascha 11 PMpTue, 11 Apr 2017 16:06:37 +030006Tuesday 2017, 16:06:37

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132