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

时间:2012-12-29 17:35:35

标签: 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。

5 个答案:

答案 0 :(得分:135)

这是known issue

  

可用日期实际上是支持var_dump()的副作用 - derick@php.net

出于某种原因,您不应该能够访问该属性,但var_dump无论如何都会显示它。如果您确实希望以该格式获取日期,请使用DateTime::format()函数。

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

答案 1 :(得分:14)

除了使用DateTime::format()之外,您还可以使用反射访问该属性:

<?php

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

这比使用format()要快一些,因为format()格式化已经格式化的时间字符串。特别是如果你在循环中多次这样做。

然而,这不是PHP的常规行为。在上面的评论中提到的@Nile已经提交了一个bug报告。

答案 2 :(得分:1)

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

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

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

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

如果您不满意,可以延长课程,或者使用Carbon为您扩展课程。

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

如果你更好地var_dump()如何创建对象的假输出,请查看__debugInfo()

答案 3 :(得分:1)

如果您在询问财产日期之前只使用 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,你就会再次收到错误。

答案 4 :(得分:0)

DateTime的date属性受保护。

您可以使用格式功能显示日期。

<?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) {
}