Возвращающий значение NULL с объявлениями возвращаемого типа
Я занимался рефакторингом кодовой базы для использования с PHP7, в частности, реализовывал подсказки скалярного типа и подсказки возвращаемого типа, когда столкнулся с проблемой.
У меня есть класс с некоторыми свойствами, одно из которых - идентификатор. Этот идентификатор не является обязательным (вы можете создать объект без установки идентификатора). При создании нового объекта этого класса вы не задаете идентификатор, и он получает идентификатор, как только он вставляется в бд (отдельным классом сопоставления).
Этот класс картографа должен проверьте, существует ли объект уже в бд, и он делает это, проверяя, установлен ли идентификатор:
if(empty($exampleObject->getId())) {
// Insert object
} else {
// Update object
}
Я применял подсказки типа возвращаемого значения к каждой функции в моей кодовой базе, и проблема в том, что функция getId()
не может возвращать NULL, если я применяю int возвращаемый тип. Это приводит к ошибкам ввода, даже без включения строгого ввода:
Неустранимая ошибка: Неперехваченная ошибка типа: Возвращаемое значение ExampleClass::getId() должно иметь тип integer, null возвращенный
Я подумывал не устанавливать подсказку типа возвращаемого значения для этого геттера, но затем понял, что проблема, вероятно, не в подсказке типа возвращаемого значения, а в том факте, что я использую смешанные типы возвращаемого значения. Я помню, что где-то читал, что использование смешанных типов возвращаемых данных - это плохо, но я не уверен, как решить эту проблему без использования смешанных типов возвращаемых данных. Я мог бы:
- Создайте исключение в получателе и разработайте проверку в классе mapper так, чтобы он перехватывал это исключение.
- Перехватите исключение TypeError и используйте его, чтобы указать, что идентификатор не установлен.
- Сделайте свойство id общедоступным, чтобы я мог вызвать isset непосредственно на этом.
- Добавьте другой метод
hasId() return isset($this->id)
Честно говоря, мне не очень нравится ни одно из этих решений, и мне было интересно, есть ли лучший вариант. Какова наилучшая практика в подобных случаях?
Кроме того, разве я не должен получать ошибку ввода только в том случае, если у меня включена строгая типизация? Я думал, что PHP7 по умолчанию установлено значение "слабые подсказки типа".
2 answers
PHP 7.1 добавлен типы, допускающие обнуление , где вы ставите знак вопроса перед именем типа, чтобы отметить возвращаемый тип как принимающий как этот тип, так и null:
public function getId(): ?int {
/* … */
}
Если вы все еще используете PHP 7.0, я предлагаю опустить объявление типа и использовать блок документов.