[英]Why can't I access DateTime->date in PHP's DateTime class?
使用DateTime
類,如果我嘗試運行以下代碼:
$mydate = new DateTime();
echo $mydate->date;
我會回復這個錯誤信息
注意:未定義的屬性: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。
這是一個已知問題。
可用日期實際上是此處支持
var_dump()
副作用 – derick@php.net
出於某種原因,您不應該能夠訪問該屬性,但var_dump
無論如何都會顯示它。 如果您確實想以該格式獲取日期,請使用DateTime::format()
函數。
echo $mydate->format('Y-m-d H:i:s');
更新:PHP7.3 中的行為已更改,原始答案不再有效。 要在所有 PHP 版本中獲得相同的結果,包括。 >=7.3,可以使用如下代碼:
$dt = new DateTime();
$date = $dt->format('Y-m-d\TH:i:s.v');
為了記錄,原始答案:
除了調用DateTime::format()
您還可以使用反射訪問該屬性:
<?php
$dt = new DateTime();
$o = new ReflectionObject($dt);
$p = $o->getProperty('date');
$date = $p->getValue($dt);
這比使用format()
稍快,因為format()
格式化已經格式化的時間字符串。 特別是如果你在循環中多次這樣做。
然而,這不是 PHP 的記錄行為,它可能隨時更改。
正如其他答案所指出的,這是 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();
如果您了解var_dump()
如何創建對象的假輸出,請查看__debugInfo()
DateTime 的日期屬性受到保護。
您可以使用格式功能顯示日期。
<?php
try {
$time = new DateTime();
echo($time->format("Y-m-d H:i:s"));
} catch (Exception $e) {
}
或者您可以轉換為數組:
<?php
try {
$time = (array) new DateTime();
var_dump($time["date"]);
} catch (Exception $e) {
}
如果您只是在詢問屬性日期之前使用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,您就會再次收到錯誤消息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.