gpt4 book ai didi

php - print_r() 向 DateTime 对象添加属性

转载 作者:IT王子 更新时间:2023-10-29 00:01:21 25 4
gpt4 key购买 nike

考虑以下代码示例:

$m_oDate = new DateTime('2013-06-12 15:54:25');
print_r($m_oDate);
echo $m_oDate->date;

从 PHP 5.3 开始,这会产生(类似于)以下输出:

DateTime Object
(
[date] => 2013-06-12 15:54:25
[timezone_type] => 3
[timezone] => Europe/Amsterdam
)
2013-06-12 15:54:25

但是下面的代码:

$m_oDate = new DateTime('2013-06-12 15:54:25');
echo $m_oDate->date;

...只是发出一个错误:

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

为什么 print_r() 将这些属性“添加”到对象中?请注意,它们没有被定义为 manual page 上的 DateTime 类的一部分。 .

最佳答案

这是reported as Bug #49382在 PHP 中。

在 PHP 5.3 中,添加了内部功能以允许 print_r() 显示 DateTime 实例所持有的底层时间戳值的详细信息,以帮助调试。此更改的副作用是,当对象转储为文本时,这些幻像公共(public)属性会添加到实例中。

使用reflection可以达到同样的效果访问这些属性,如果您需要访问这些属性,那么使用反射将是可行的方法,因此您不会引发错误。

然而,应该注意的是,你不应该真正使用这些属性——因为它们没有被定义为对象的成员,所以不能保证它们在未来的 PHP 中会继续携带相同的数据(甚至存在)版本。如果您需要访问信息,请改用以下方法(定义为 API 的一部分):

// $obj->date
$obj->format('Y-m-d H:i:s');

// $obj->timezone
$obj->getTimezone()->getName();
// or...
$obj->getTimezone()->getOffset();
// or...
$obj->getTimezone()->listAbbreviations(); // returns an array, so may need
// further processing to be of use

注意:timezone_type 属性无法通过 PHP API 访问。它是一个内部值,在用户空间中没有用,因为它描述了在转储对象时 timezone 持有的字符串类型 - 即在上面的代码示例中获取时区信息的三种方法之一。为完整起见,其可能值为 defined通过以下方式:

Value | Type                  | Userland equivalent------+-----------------------+----------------------------------  1   | time offset           | DateTimeZone::getOffset()  2   | TimeZone abbreviation | DateTimeZone::listAbbreviations()  3   | TimeZone identifier   | DateTimeZone::getName()

关于php - print_r() 向 DateTime 对象添加属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17066034/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com