2010-05-05 2 views
11

У меня есть метод класса, который имеет дело с датами:Тип намекая и необязательные атрибуты в PHP

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

Поскольку наличие элемента может иметь нижний предел, верхний предел, как и ни один, я хотел бы сделать setAvailability () также принимают значения NULL. Однако постоянная NULL нарушает тип намекая:

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

триггеры:

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

И, насколько я знаю, я не могу иметь экземпляр DateTime без значения. (? Могу ли я)

По причине я не могу понять, это похоже на работу:

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

Но это выглядит как хак, который работает по чистой случайности.

Как бы вы справились с неустановленными датами в PHP-классах?

ответ

19

Об этом говорится довольно ясно в 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

Ссылка на соответствующую страницу руководства –

+1

+1 похоже на поведение, на которое можно положиться. Было бы неплохо узнать, есть ли какой-то «нулевой» объект DateTime. –

+2

@zerocrates: Спасибо. Это не только документированное поведение - это также объясняется в главе, которую вы ожидаете. Я чувствую себя новобранец <:-) –

2

мне ваш пример выглядит внутри Item объектов будет проверка, если параметр был нулевым или DateTime объект (если/другое). Я удаляю эту ответственность от объектов Item в пользовательскую DateTime, например, путем продления DateTime. Этот MyDateTime будет нести ответственность за то, что дата указана с начала раз или нет. Для этого нет необходимости в Item.

+0

Идея хорошая, но я предпочитаю пропустить такой дополнительный слой сложности. (Фактический код не очень сильно использует даты.) –

Смежные вопросы