2016-02-02 2 views
13

Я пересматривал базу кода для использования с PHP7, в частности, применяя подсказки скалярного типа и подсказки возвращаемого типа, когда у меня возникла проблема.Возвращение NULL с декларациями типа возвращаемого значения

У меня есть класс с некоторыми свойствами, один из которых id. Этот идентификатор не является обязательным (вы можете создать объект без установки id). При создании нового объекта этого класса вы не устанавливаете id, и он получает идентификатор, как только он вставлен в db (отдельным классом сопоставления).

Этот картографа класс должен проверить, если объект уже существует в БД, и он делает это, проверяя, если идентификатор установлен:

if(empty($exampleObject->getId())) { 
    // Insert object 
} else { 
    // Update object 
} 

Я прикладывал намеков Возвращаемый тип каждой функции в моем коде , и проблема в том, что функция getId() не может вернуть NULL, если я применяю int тип возврата. Это TypeErrors, даже без включена жесткая типизация:

Fatal error: Uncaught TypeError: Return value of ExampleClass::getId() must be of the type integer, null returned

Я считал не устанавливая тип возвращаемого намека на этот геттер, но потом я понял, что проблема, вероятно, не возвращаемый тип намекая, но тот факт, что я используя смешанные типы возврата. Я помню, где-то читал, что использование смешанных типов возврата - это плохо, но я не уверен, как справиться с этим, не используя смешанные типы возврата. Я мог бы:

  • Выбросьте исключение в геттере и создайте проверку в классе сопоставления, чтобы он поймал это исключение.
  • Поймайте исключение TypeError и используйте это, чтобы указать, что идентификатор не установлен.
  • Сделайте объект id открытым, поэтому я могу позвонить isset прямо на это.
  • Добавить другой метод hasId() return isset($this->id)

Честно говоря, не очень, как и любой из этих решений, и мне было интересно, если есть лучший вариант. Какова наилучшая практика для подобных случаев?

Кроме того, не должен ли я получать TypeError только в том случае, если включена строгая типизация? Я думал, что PHP7 по умолчанию «слабые подсказки».

+1

try 'int?' As return-type – tkausl

+1

@tkausl Это реализовано? Я не знал об этой функции (это не в документации PHP), но я нашел [этот RFC] (https://wiki.php.net/rfc/nullable_types) (типы с нулевым значением). Это то, о чем вы говорите? Если это так, это проект, ориентированный на PHP 7.1. – Compizfox

+0

О ... Я был уверен, что видел это где-то, но не знал, где, извините. – tkausl

ответ

19

PHP 7.1 добавлены nullable types, где поставить знак вопроса перед именем типа для обозначения типа возврата, как принимать как этот тип и нуль:

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

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

+0

Спасибо. Таким образом, это означает, что нет ничего плохого в себе с возвратом * NULL *? – Compizfox

+0

Да, хотя есть некоторые аргументы в пользу исключения «null», но они не универсальны. – Andrea

+1

рядом с точкой, но просто подумал, что я бы указал, что PSR2 указывает открытую скобку для класса и методов на новой строке;) – wired00

0

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