เหตุใดฉันจึงไม่สามารถเข้าถึง DateTime-> date ในคลาส DateTime ของ PHP ได้


95

ใช้DateTimeคลาสถ้าฉันพยายามเรียกใช้รหัสต่อไปนี้:

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

ฉันจะตอบกลับข้อความแสดงข้อผิดพลาดนี้

หมายเหตุ: คุณสมบัติที่ไม่ได้กำหนด: DateTime :: $ date ...

ซึ่งไม่สมเหตุสมผลเพราะเมื่อเรียกใช้var_dump()ตัวแปร$mydateจะแสดงให้เห็นอย่างชัดเจนว่าคุณสมบัตินี้มีอยู่และสามารถเข้าถึงได้โดยสาธารณะ:

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


1
คำถามที่ดี. ฉันคิดอยู่ครู่หนึ่งว่าฉันไม่เข้าใจ ... อะไรเลย
regularmike

คำตอบ:


148

นี่เป็นปัญหาที่ทราบ

วันที่พร้อมให้บริการเป็นผลข้างเคียงของการสนับสนุนvar_dump()ที่นี่ - derick@php.net

ด้วยเหตุผลบางประการคุณไม่ควรเข้าถึงทรัพย์สิน แต่var_dumpแสดงให้เห็นอย่างไรก็ตาม หากคุณต้องการรับวันที่ในรูปแบบนั้นจริงๆให้ใช้DateTime::format()ฟังก์ชัน

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

1
ทำไมถึงไม่ต้องการรูปแบบที่แน่นอนนี้? เป็นรูปแบบเดียวกับ MySQL สำหรับวันที่
Elia Iliashenko

@HelgaIliashenko ฉันไม่แน่ใจว่าฉันเข้าใจ ฉันไม่เคยบอกว่าใครไม่ต้องการรูปแบบที่แน่นอนนี้
jeremy

สิ่งนี้จะเหมือนกันหากใช้ var_dump หรือ print_r
AndyGaskell

15

นอกจากการโทรแล้วDateTime::format()คุณสามารถเข้าถึงคุณสมบัติโดยใช้การสะท้อน:

<?php

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

ซึ่งเร็วกว่าการใช้เล็กน้อยformat()เนื่องจากformat()รูปแบบการจับเวลาที่ได้รับการจัดรูปแบบไว้แล้ว โดยเฉพาะอย่างยิ่งถ้าคุณทำหลาย ๆ ครั้งติดต่อกัน

อย่างไรก็ตามนี่ไม่ใช่พฤติกรรมปกติของ PHP รายงานข้อผิดพลาดได้ถูกส่งไปแล้วเป็น @Nile ที่กล่าวถึงในความคิดเห็นด้านบน


2

ตามที่ระบุไว้ในคำตอบอื่น ๆ มันเป็นปัญหาเกี่ยวกับ PHP ซึ่งยังไม่ได้รับการแก้ไข ณ วันนี้ แต่ถ้าเป็น 'ผลข้างเคียง' var_dump()ฉันไม่แน่ใจ ..

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

สิ่งที่ฉันมั่นใจก็คือ ถ้าคุณสมบัติของDateTimeสถานที่ที่เราหมายถึงจะถูกใช้งานได้ แต่ก็เหมือนกับคลาสภายในหลาย ๆ คลาสที่ไม่ใช่และคุณไม่ควรใช้วิธี "แฮ็ก" หรือ "ผิดพลาด" ในการแก้ไขโค้ดของคุณ คุณควรใช้APIแทน

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

หากคุณไม่พอใจคุณสามารถขยายคลาสหรืออาจใช้คาร์บอนที่ขยายให้คุณได้

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

หากคุณตัดพ้อว่าvar_dump()จะสร้างผลลัพธ์ปลอมของวัตถุได้อย่างไรลองดูที่__debugInfo()


2

คุณสมบัติวันที่ของ 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) {
}

เขาอยากรู้ว่าทำไมเขาถึงไม่สามารถเข้าถึงคุณสมบัติวันที่ของวัตถุ DateTime ได้ ... คุณเห็นที่ไหนเขาต้องการจัดรูปแบบค่า Datetime ที่เก็บไว้? "Ymd H: i: s" คือรูปแบบในแม่มดวันที่เป็นค่าเริ่มต้น!
filipe

การแปลงออบเจ็กต์เป็นอาร์เรย์ - ตามที่คุณแนะนำ - น่าจะเป็นวิธีที่ง่ายที่สุด
Jeffz

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 และคุณจะได้รับข้อผิดพลาดอีกครั้ง


error_reporting (0); echo date ("Ymd H: i: s", strtotime ($ mydate-> date));
Kaushik Das
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.