2010-05-05 26 views
11

Mam metody klasy, która zajmuje się terminach:typów parametrów i opcjonalne atrybuty w PHP

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

Ponieważ dostępność element może mieć niższy limit, górny limit, oba lub żadne, chciałbym aby setAvailability () również akceptuj wartości NULL. Jednak stała NULL narusza typów parametrów:

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

wyzwala:

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

I, o ile wiem, nie mogę mieć instancję DateTime bez wartości. (Czy mogę)

z jakiegoś powodu nie mogę zrozumieć, to wydaje się działać:

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

Ale wygląda na to hack który działa przez czysty przypadek.

Jak radzić sobie z nie ustawionymi datami w klasach PHP?

Odpowiedz

19

Ma to dość wyraźnie w 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

Dodany link do odpowiedniej strony podręcznika –

+1

+1 wygląda na zachowanie, na którym można polegać. Byłoby fajnie dowiedzieć się, czy istnieje jakiś "zerowy" obiekt DateTime. –

+2

@zerocrates: Dzięki. Nie tylko jest to udokumentowane zachowanie - wyjaśniono to również w rozdziale, którego można się spodziewać. Czuję się jak nowicjusz <:-) –

2

Dla mnie Twój przykład wygląda wewnątrz pozycja obiektów będzie sprawdzić, czy parametr był zerowy lub obiekt DateTime (if/else). Usunęłabym tę odpowiedzialność z obiektów Item do niestandardowego DateTime, np. Rozszerzając DateTime. To MyDateTime będzie odpowiedzialne za poznanie, czy data jest "od początku czasów", czy też nie. Nie ma potrzeby, aby Pozycja to zrobiła.

+0

Pomysł jest dobry, ale wolę teraz pominąć warstwę o większej złożoności. (Rzeczywisty kod tak naprawdę nie wykorzystuje intensywnie dat.) –

Powiązane problemy