Тип подсказки и необязательные атрибуты в PHP - PullRequest
13 голосов
/ 05 мая 2010

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

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?

Ответы [ 2 ]

20 голосов
/ 05 мая 2010

Об этом довольно ясно говорится в руководстве PHP по печатанию :

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

2 голосов
/ 05 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...