为什么我不能在PHP的DateTime类中访问DateTime-> date? 这是一个错误?

使用DateTime类,如果我尝试运行下面的代码。

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

我会回来这个错误消息

 Notice: Undefined property: DateTime::$date... 

这是没有道理的,因为当在variables$mydate上运行var_dump()时,它清楚地显示这个属性存在并且是可公开访问的。

 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。

这是一个已知的问题 。

可用date实际上是支持var_dump()一个副作用 – derick@php.net

出于某种原因,你不应该能够访问属性,但var_dump反正显示它。 如果你真的想以这种格式获取date,使用DateTime::format()函数。

 echo $mydate->format('Ymd H:i:s'); 

除了使用DateTime::format()你可以使用reflection来访问属性:

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

这比使用format()略快,因为format()格式化已经格式化的时间string。 特别是如果你多次循环做。

但是,这不是PHP的常规行为。 bugreport已经在上面的注释中提到了@Nile。

正如其他答案所指出的那样,这是一个PHP的问题,到目前为止尚未解决,但如果这是var_dump()的“副作用”,我不太确定..

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

我可以肯定的是, 如果 DateTime的属性被我们使用,它将会被使用。 但是像许多内部类一样,你不应该依赖“hacky”或“glitchy”方法来修复你的代码。 相反,你应该使用他们的API 。

 echo (new DateTime())->format('Ymd H:i:s'); 

如果你不满意,你可以扩展这个类,或者使用Carbon来扩展它。

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

如果你是如何var_dump()创build一个对象的假输出看看__debugInfo()

如果您在查询属性date之前只是使用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 

因此,即使对于该对象,您也可以看到属性date。 我无法理解这种行为。 只是注释掉var_Dump,你会再次得到错误。