【问题标题】:Why is a DateTime object unavailable until I do a no-op? [duplicate]为什么在我不执行任何操作之前 DateTime 对象不可用? [复制]
【发布时间】:2016-11-30 22:02:06
【问题描述】:

我是 PHP 新手。以下错误(?)花了我 891723498 小时在我的代码中找到。有人可以向我解释是什么原因造成的,也许是一种解决方法?现在我只是留下json_encode() 的电话。

这是我的代码的精炼版本。可能有除json_encode()以外的其他函数有同样的效果,我不知道。

这是我的 repl 的直接复制粘贴(使用 Boris php repl -- https://github.com/borisrepl/boris)。

./bin/boris
[1] boris> function broken () {
[1]     *>   $timezone = new DateTimeZone("America/New_York");
[1]     *>   $datetime = new DateTime("now", $timezone);
[1]     *>   return date_parse($datetime->date);
[1]     *> }
// NULL
[2] boris>
[2]     *> function works () {
[2]     *>   $timezone = new DateTimeZone("America/New_York");
[2]     *>   $datetime = new DateTime("now", $timezone);
[2]     *>   json_encode($datetime);
[2]     *>   return date_parse($datetime->date);
[2]     *> }
// NULL
[3] boris> broken();
PHP Notice:  Undefined property: DateTime::$date in /home/sirrobert/Projects/sirrobert/archon/code/repl/boris/lib/Boris/EvalWorker.php(152) : eval()'d code on line 4
// array(
//   'year' => false,
//   'month' => false,
//   'day' => false,
//   'hour' => false,
//   'minute' => false,
//   'second' => false,
//   'fraction' => false,
//   'warning_count' => 0,
//   'warnings' => array(
//
//   ),
//   'error_count' => 1,
//   'errors' => array(
//     0 => 'Empty string'
//   ),
//   'is_localtime' => false
// )
[4] boris> works();
// array(
//   'year' => 2016,
//   'month' => 11,
//   'day' => 30,
//   'hour' => 16,
//   'minute' => 53,
//   'second' => 35,
//   'fraction' => 0.0,
//   'warning_count' => 0,
//   'warnings' => array(
//
//   ),
//   'error_count' => 0,
//   'errors' => array(
//
//   ),
//   'is_localtime' => false
// )
[5] boris>

这是来自php -a repl 的相同内容,但有用的输出较少。

php > function broken () {
php {   $timezone = new DateTimeZone("America/New_York");
php {   $datetime = new DateTime("now", $timezone);
php {   return date_parse($datetime->date);
php { }
php >
php > function works () {
php {   $timezone = new DateTimeZone("America/New_York");
php {   $datetime = new DateTime("now", $timezone);
php {   json_encode($datetime);
php {   return date_parse($datetime->date);
php { }
php >
php > broken()
php > ;
PHP Notice:  Undefined property: DateTime::$date in php shell code on line 4
php > works();
php >

到底为什么json_encode($datetime)“实现”了 $datetime 对象?

我最好的猜测是:

  1. json_encode() 中使用$datetime 对象时会发生某种活化,而不是在访问属性时,

  1. 我在并行化的内部代码中遇到了某种竞争条件?

【问题讨论】:

  • [2] *> json_encode($datetime); 部分什么都不做*。并在此处阅读如何访问 DateTime 对象 php.net/manual/en/book.datetime.php *您对返回值没有做任何事情。
  • 如果你把它改成return date_parse($datetime->format('Y-m-d H:i:s'));就可以了
  • 对我来说,似乎在调用内部某些东西之前没有定义日期属性,但是,我建议有更好的接口来获取您需要的日期输出(您可以触发相同的print_rvar_dump 而不是 json_encode) 的行为,看起来有点像薛定谔类。
  • 我不得不承认我之前从未见过有人直接使用$dt->date,它看起来合乎逻辑但从未见过直接使用它
  • bugs.php.net/bug.php?id=49382stackoverflow.com/questions/14084222 看起来也已经存在了一段时间。和

标签: php wordpress datetime


【解决方案1】:

好的,根据提供的 cmets 和链接,根据http://bugs.php.net/bug.php?id=49382Why can't I access DateTime->date in PHP's DateTime class? Is it a bug?,这似乎是一个已知(但未确定优先级)问题

问题似乎是 DateTime 类的延迟加载,这显然不是通过直接访问对象的属性来正确触发的。

解决方案显然是按照我所做的(无操作)或进行特定的字符串格式化,即使您希望它们采用的格式是默认的 ->date 格式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多