【问题标题】:DateTime instance property changes due to a var_dump() or print_r()DateTime 实例属性因 var_dump() 或 print_r() 而更改
【发布时间】:2018-04-21 18:13:53
【问题描述】:

我有以下代码:

<?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"

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

使用print_r() 代替var_dump() 具有相同的结果。

【问题讨论】:

    标签: php datetime var-dump


    【解决方案1】:

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

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

    这会给你一个未定义的属性通知。

    当您对对象执行print_rvar_dump 时,PHP 会创建要显示的timezone 属性,但修改该属性不会修改基础数据。

    下次您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'
    

    【讨论】:

    • 感谢您的回复。您能否详细说明在使用print_r()var_dump() 时PHP 使用的底层机制来显示不存在的属性? PHP 怎么能做到这一点?
    • 如果您想了解有关此已知“错误”的更多信息 - bugs.php.net/bug.php?id=75232
    • @RicardoPérezLópez 关于这个还有一些其他问题,这些问题会更详细地介绍。 Here's one
    • 我考虑过关闭这个 Q 作为它的副本,但我想专门向您展示如何设置时区。
    • 非常感谢@Don'tPanic。有趣的是,PysSH 有一种奇怪的行为。 $date = new DateTime; echo $date-&gt;timezone; 显示时区。
    猜你喜欢
    • 2012-04-20
    • 2011-08-05
    • 1970-01-01
    • 2011-03-25
    • 2013-01-22
    • 1970-01-01
    • 2013-06-08
    • 2018-02-02
    相关资源
    最近更新 更多