Php DateTime实例属性因var_dump()或print_r()而更改

Php DateTime实例属性因var_dump()或print_r()而更改,php,datetime,var-dump,Php,Datetime,Var Dump,我有以下代码: 时区不是新DateTime类的属性。您可以在创建DateTime对象后立即尝试访问它来验证这一点 $date = new DateTime; echo $date->timezone; 这将给您一个未定义的属性通知 PHP创建timezone属性,当您在对象上打印\r或var\u dump时显示,但修改该属性不会修改基础数据 下次更改或打印对象时,将重新生成显示属性,覆盖所做的更改 如果确实需要更改时区,可以使用该方法 $date->setTimezone(new

我有以下代码:

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

$date = new DateTime;
echo $date->timezone;
这将给您一个未定义的属性通知

PHP创建timezone属性,当您在对象上打印\r或var\u dump时显示,但修改该属性不会修改基础数据

下次更改或打印对象时,将重新生成显示属性,覆盖所做的更改

如果确实需要更改时区,可以使用该方法

$date->setTimezone(new DateTimeZone('Europe/Madrid'));
或者在PHP配置中设置时区

有趣的是,直接引用timezone属性仍然会显示旧值,即使您使用setTimezone更新它。显然,您需要var_转储整个对象,以便它重新创建这些属性

$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'

谢谢你的回复。请详细说明PHP在使用print\u r或var\u dump时用于显示不存在属性的底层机制好吗?PHP是如何做到这一点的?如果你想了解更多关于这个已知bug的信息-@RicardoPérezLópez,还有一些关于这个问题的其他问题需要更详细地讨论。我曾考虑过把这个Q作为一个复制品来结束,但我想特别向你展示如何设置时区。非常感谢,@Don'tPanic。有趣的是,PysSH有一种奇怪的行为$日期=新的日期时间;echo$日期->时区;显示时区。
$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'