2012-12-29 19 views
64

使用DateTime類,如果我嘗試運行下面的代碼。爲什麼我不能在PHP的DateTime類中訪問DateTime-> date?這是一個錯誤嗎?

$mydate = new DateTime(); 
echo $mydate->date; 

我會回來此錯誤消息

Notice: Undefined property: DateTime::$date... 

這是沒有意義的,因爲在可變$mydate運行var_dump()時,它清楚地表明,這種屬性存在並對外開放。

var_dump($mydate); 

object(DateTime)[1] 
    public 'date' => string '2012-12-29 17:19:25' (length=19) 
    public 'timezone_type' => int 3 
    public 'timezone' => string 'UTC' (length=3) 

這是PHP中的錯誤還是我做錯了什麼?我正在使用PHP 5.4.3。

+0

好問題。我想了一會兒,我不明白......任何事情。 – regularmike

回答

101

這是一個known issue

日期是可用實際上是支持var_dump()這裏的副作用 - [email protected]

出於某種原因,你不應該能夠訪問該財產,但var_dump無論如何顯示它。如果您確實希望以該格式獲取日期,請使用DateTime::format()函數。

<?php 

$dt = new DateTime(); 
$o = new ReflectionObject($dt); 
$p = $o->getProperty('date'); 
$date = $p->getValue($dt)); 

這是輕微的速度比使用format()因爲format()格式已經被格式化的TIMESTRING:

echo $mydate->format('Y-m-d H:i:s'); 
+1

爲什麼不想要這種確切的格式?它與MySQL的日期格式相同。 –

+0

@HelgaIliashenko我不確定我的理解。我從來沒有說過一個人不會想要這個確切的格式。 – jeremy

13

除了使用DateTime::format()您可以訪問屬性使用反射。特別是如果你多次循環做。

但是,這不是PHP的常規行爲。 bugreport已經在上面的評論中提到了@Nile。

0

正如其他的答案提到的,它是用PHP的一個問題是未解決的今天,但如果它是一個var_dump()「副作用」我不是很確定..

echo ((array) new DateTime())['date']; // Works in PHP 7. 

我我很確定如果DateTime的屬性在哪裏打算由我們使用它將會被提供。但是像許多內部類,他們是而不是,你不應該依靠「hacky」或「glitchy」方法來修復你的代碼。相反,你應該使用他們的API

echo (new DateTime())->format('Y-m-d H:i:s'); 

如果你不滿意,你可以擴展類或者是使用Carbon擴展它。

echo (new Carbon())->toDateTimeString(); 

如果wounder如何var_dump()創建對象的假輸出看看__debugInfo()

0

如果只是用一個的var_dump之前要求物業日期一切工作還好吧:

$mydate = new DateTime(); 
var_Dump($mydate); 
echo '<br>'; 
echo $mydate->date; 

此送貨:

object(DateTime)#1 (3) { ["date"]=> string(26) "2017-04-11 08:44:54.000000" ["timezone_type"]=> int(3) ["timezone"]=> string(16) "America/New_York" } 
2017-04-11 08:44:54.000000 

因此,即使對於對象,您也會看到屬性日期存在。我無法理解這種行爲。只需將var_Dump註釋掉,您將再次獲得錯誤信息。

+0

error_reporting(0); echo date(「Y-m-d H:i:s」,strtotime($ mydate-> date)); –

相關問題