2016-11-30 56 views
4

我是PHP新手。以下錯誤(?)花了我891723498小時來找到我的代碼。有人可以向我解釋是什麼造成了這種情況,也許是一種解決辦法?現在我只需要撥打json_encode()爲什麼DateTime對象直到我沒有操作時纔可用?

這是我的代碼的蒸餾版本。除了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對象不是當它被用於性訪問某種類型的vivification的正在發生的事情,

  1. 我在並行內部代碼中遇到某種競爭條件?
+0

'[2] *> json_encode($ datetime);'零件什麼也不做*。並在這裏閱讀如何訪問DateTime對象http://php.net/manual/en/book.datetime.php *你沒有做任何事情的返回值。 – JOUM

+1

如果你把它改爲'return date_parse($ datetime-> format('Ymd H:i:s'));'它的工作原理 – RiggsFolly

+0

對我來說似乎沒有定義日期屬性,直到內部被調用,然而,我建議有更好的接口來獲得你需要的日期輸出(你可以用'print_r'或'var_dump'而不是'json_encode'來觸發相同的行爲),它看起來有點像薛丁格類。 – Scuzzy

回答

0

好吧,根據所提供的評論和鏈接,看起來這是一個已知的(但unprioritized)問題,每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

相關問題