Возвращающий значение 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 по умолчанию установлено значение "слабые подсказки типа".

Author: Andrea, 2016-02-02

2 answers

PHP 7.1 добавлен типы, допускающие обнуление , где вы ставите знак вопроса перед именем типа, чтобы отметить возвращаемый тип как принимающий как этот тип, так и null:

public function getId(): ?int {
    /* … */
}

Если вы все еще используете PHP 7.0, я предлагаю опустить объявление типа и использовать блок документов.

 22
Author: Andrea, 2016-12-04 15:34:37

Использование null означает использование объектно-ориентированных подходов, поскольку типы значений не могут быть нулевыми. Поэтому может быть полезно использовать оболочку класса для целочисленного типа. Например, Шина из типов SPL.

 0
Author: max, 2016-02-02 20:52:36