Тип подсказки и необязательные атрибуты в 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 для этого.