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

У меня есть метод класса, который имеет дело с датами:

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

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

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

триггеры:

Допустимая фатальная ошибка: аргумент 1, переданный в Foo:: setAvailability(), должен быть экземпляр DateTime, null заданный

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

По какой-то причине я не могу понять, это работает:

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

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

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

Ответ 1

Это довольно четко сказано в руководстве PHP по типу ввода:

Теперь функции теперь могут заставить объекты быть объектами (указав имя класса в прототипе функции) или массивы (начиная с PHP 5.1). Однако, если NULL используется как значение параметра по умолчанию, он будет разрешен в качестве аргумента для любого последующего вызова.

Ответ 2

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