为什么我不能在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,你会再次得到错误。