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