2010-05-05 12 views
11

Tôi có một phương pháp học mà những giao dịch với các ngày:Loại gián tiếp và tùy chọn các thuộc tính trong PHP

public function setAvailability(DateTime $start, DateTime $end){ 
} 

Kể từ mục sẵn có có thể có giới hạn dưới, giới hạn trên, cả hai hay không, tôi muốn làm cho setAvailability () chấp nhận giá trị NULL. Tuy nhiên, NULL liên tục vi phạm kiểu gián tiếp:

$foo->setAvailability(NULL, $end); 

gây nên:

Catchable fatal error: Argument 1 passed to Foo::setAvailability() must be an instance of DateTime, null given

Và, như xa như tôi biết, tôi không thể có một trường hợp không có giá trị DateTime. (? Can I)

Đối với một lý do tôi không thể nắm bắt, điều này dường như làm việc:

public function setAvailability(DateTime $start=NULL, DateTime $end=NULL){ 
} 
... 
$foo->setAvailability(NULL, $end); 

Nhưng nó trông giống như một hack mà làm việc một cách tình cờ tinh khiết.

Bạn sẽ xử lý những ngày không được đặt trong các lớp học PHP như thế nào?

Trả lời

19

Điều này được nêu khá rõ trong the PHP manual on typehinting:

Functions are now able to force parameters to be objects (by specifying the name of the class in the function prototype) or arrays (since PHP 5.1). However, if NULL is used as the default parameter value, it will be allowed as an argument for any later call.

+0

Đã thêm liên kết đến trang hướng dẫn sử dụng có liên quan –

+1

+1 trông giống như một hành vi dựa vào. Nó vẫn sẽ được tốt đẹp để tìm hiểu xem có một số loại "null" DateTime Object. –

+2

@zerocrates: Cảm ơn. Không chỉ đó là một hành vi được ghi chép - nó cũng được giải thích trong chương bạn mong đợi. Tôi cảm thấy như một tân binh <:-) –

2

Đối với tôi ví dụ của bạn trông giống như bên trong mục đối tượng sẽ có một tấm séc nếu tham số là null hoặc một đối tượng DateTime (if/else). Tôi sẽ loại bỏ trách nhiệm đó khỏi các đối tượng Item thành một DateTime tùy chỉnh, ví dụ như bằng cách mở rộng DateTime. MyDateTime này sẽ chịu trách nhiệm cho biết nếu ngày là 'kể từ đầu của thời gian' hay không. Không cần Item để làm điều này.

+0

Ý tưởng là tốt nhưng tôi thích bỏ qua lớp phức tạp thêm như vậy bây giờ. (Mã thực sự không thực sự sử dụng nhiều ngày.) –

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