簡體   English   中英

為什么我不能在 PHP 的 DateTime 類中訪問 DateTime->date?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM