由于var_dump()或print_r()而导致DateTime实例属性更改

时间:2017-11-08 21:43:22

标签: php datetime var-dump

我有以下代码:

<?php

$date = new DateTime;
var_dump($date);
$date->timezone = 'Europe/Madrid';
var_dump($date->timezone);  // Shows 'Europe/Madrid'
var_dump($date);            // Shows 'UTC' (!)
var_dump($date->timezone);  // Shows 'UTC' (!!)

显示以下输出:

object(DateTime)#1 (3) {
  ["date"]=>
  string(26) "2017-11-08 21:21:15.596968"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
string(13) "Europe/Madrid"
object(DateTime)#1 (3) {
  ["date"]=>
  string(26) "2017-11-08 21:21:15.596968"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
string(3) "UTC"

当我做一个简单的$date->timezone时,为什么var_dump($date)从“欧洲/马德里”变回“UTC”?

使用print_r()代替var_dump()会产生相同的结果。

1 个答案:

答案 0 :(得分:1)

timezone不是新DateTime类的属性。您可以在创建DateTime对象后立即尝试访问它来验证它。

$date = new DateTime;
echo $date->timezone;

这将为您提供未定义的财产通知。

PHP创建timezone属性,以便在对象上执行print_rvar_dump时显示,但修改该属性不会修改基础数据。

下次对象var_dumpprint_r时,将重新生成显示属性,覆盖您的更改。

如果您确实需要更改时区,则可以使用setTimezone方法。

$date->setTimezone(new DateTimeZone('Europe/Madrid'));

(或者在PHP配置中设置时区。)

有趣的是,直接引用timezone属性即使用setTimezone更新后仍显示旧值。显然,您需要var_dump整个对象才能重新创建这些属性。

$date = new DateTime;
var_dump($date);     // Shows 'UTC'
$date->setTimezone(new DateTimeZone('Europe/Madrid'));
var_dump($date->timezone);  // Still shows 'UTC' (!)
var_dump($date);            // Shows 'Europe/Madrid'
var_dump($date->timezone);  // Shows 'Europe/Madrid'