2012-12-29 27 views
64

Sử dụng lớp DateTime, nếu tôi cố gắng chạy mã sau đây.Tại sao tôi không thể truy cập DateTime-> date trong lớp DateTime của PHP? Nó là một lỗi?

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

tôi sẽ liên hệ lại thông báo lỗi này

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

nào không có ý nghĩa vì khi chạy var_dump() trên biến $mydate, nó rõ ràng cho thấy rằng thuộc tính này tồn tại và có thể truy cập công khai.

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) 

Đây có phải là lỗi trong PHP hoặc tôi đang làm điều gì sai? Tôi đang sử dụng PHP 5.4.3.

+0

Câu hỏi hay. Tôi nghĩ một lúc mà tôi không hiểu ... bất cứ điều gì. – regularmike

Trả lời

101

Đây là known issue.

ngày bị sẵn thực sự là một tác dụng phụ hỗ trợ cho var_dump() đây - [email protected]

Đối với một số lý do, bạn không phải để có thể truy cập vào bất động sản nhưng var_dump cho thấy nó anyways. Nếu bạn thực sự muốn có ngày ở định dạng đó, hãy sử dụng hàm DateTime::format().

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

Tại sao một người không muốn định dạng chính xác này? Đó là định dạng giống như MySQL có cho ngày tháng. –

+0

@HelgaIliashenko Tôi không chắc tôi hiểu. Tôi chưa bao giờ nói một người không muốn định dạng chính xác này. – jeremy

13

Bên cạnh sử dụng DateTime::format() bạn có thể truy cập vào các tài sản sử dụng phản ánh:

<?php 

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

Đây là nhẹ nhanh hơn so với sử dụng format()format() định dạng một timestring đó đã được định dạng. Đặc biệt là nếu bạn làm điều đó nhiều lần trong một vòng lặp.

Tuy nhiên, đây không phải là hành vi thường xuyên của PHP. Một báo cáo lỗi đã được nộp dưới dạng @Nile được đề cập trong các nhận xét ở trên.

0

Theo ghi nhận của các câu trả lời khác, nó là một vấn đề với PHP đó là chưa được giải quyết như ngày nay nhưng nếu nó là một 'tác dụng phụ' của var_dump() tôi không như vậy chắc chắn ..

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

Những gì tôi chắc chắn về là nếu các thuộc tính của DateTime nơi có nghĩa là để chúng tôi sử dụng, nó sẽ được cung cấp. Nhưng giống như nhiều lớp học nội bộ, chúng là không phải là và bạn không nên dựa vào các phương pháp "hacky" hoặc "glitchy" để sửa mã của bạn. Thay vào đó, bạn nên sử dụng API của họ.

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

Nếu bạn không hài lòng, bạn có thể mở rộng lớp học hoặc có thể sử dụng Carbon để mở rộng cho bạn.

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

Nếu bạn wounder cách var_dump() tạo ra một sản lượng giả của một đối tượng có một cái nhìn tại __debugInfo()

0

Nếu bạn chỉ cần sử dụng một var_dump trước khi yêu cầu tất cả mọi thứ ngày bất động sản làm việc Allright:

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

Điều này phân phối:

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 

Vì vậy, bạn thấy ngày thuộc tính tồn tại ngay cả đối với đối tượng. Tôi không thể hiểu được hành vi này. Chỉ cần nhận xét ra var_Dump và bạn sẽ nhận được lỗi một lần nữa.

+0

error_reporting (0); ngày lặp lại ("Y-m-d H: i: s", strtotime ($ mydate-> ngày)); –

Các vấn đề liên quan