2012-12-29 17 views
64

DateTimeクラスを使用して、次のコードを実行しようとするとします。PHPのDateTimeクラスでDateTime-> dateにアクセスできないのはなぜですか?バグですか?

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

私は、変数$mydatevar_dump()を実行しているとき、それは明らかに、このプロパティが存在し、一般にアクセス可能であることを示しているので、意味がありません。このエラーメッセージ

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

が返されます。

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()関数を使用してください。

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

なぜこの正確なフォーマットが必要ないのですか? MySQLの日付と同じフォーマットです。 –

+0

@HelgaIliashenko私は理解しているか分からない。この正確なフォーマットが欲しいとは決して言わなかった。 – jeremy

13

DateTime::format()を使用してから、あなたは、リフレクションを使用してプロパティにアクセスすることができます:format()は既にフォーマットされたtimestringをフォーマットするため

<?php 

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

これはformat()を使用するよりも速くわずかです。特にループの中で何度もやっている場合。

しかし、これはPHPの通常の動作ではありません。既に上記のコメントに@Nileが記載されているように、バグレポートが提出されています。

0

他の回答で述べたように、それが今日のように未解決であるが、それはvar_dump()の「副作用」であるならば、私はとてもわからないPHPでの問題..です

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

何I確かにそれについてです場合DateTimeのプロパティは、それが利用可能にされていた私たちによって使用されることを意味します。しかし、多くの内部クラスのように、ではなくであり、コードを修正するための "ハッキー"や "グリッチ"メソッドに頼るべきではありません。代わりに、APIを使用してください。

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

あなたが満たされていない場合は、クラスを拡張するか、おそらくあなたのためにそれを拡張しCarbonを使用することができます。

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

あなたはvar_dump()は、オブジェクトの偽の出力を作成する方法wounder場合は、あなただけののvar_dumpを使用する場合は、プロパティの日付のすべてがオールライト作品尋ねる前に__debugInfo()

0

を見てみましょう:

$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); エコー日付( "Y-m-d H:i:s"、strtotime($ mydate-> date)); –

関連する問題