возврат null с объявлениями возвращаемого типа

<p>я реорганизовал кодовую базу для использования с php7, особенно реализуя подсказки скалярного типа и подсказки возвращаемого типа, когда столкнулся с проблемой.</p><p>у меня есть класс с некоторыми свойствами, одним из которых является идентификатор. этот идентификатор не является обязательным (вы можете создать объект без установки идентификатора). при создании нового объекта этого класса вы не устанавливаете идентификатор, и он получает идентификатор, как только он вставлен в бд (отдельным классом mapper).</p><p>этот класс mapper должен проверить, существует ли объект в бд, и он делает это, проверяя, установлен ли id:</p><pre><code>if(empty($exampleobject->getid())) { // insert object } else { // update object } я применял подсказки возвращаемого типа ко всем функциям в моей кодовой базе, и проблема в том, что функция getid() не может вернуть null, если я применяю возвращаемый тип int. это typeerrors, даже без строгой типизации:<blockquote> <strong> неустранимая ошибка </strong>: uncaught typeerror: возвращаемое значение exampleclass :: getid () должно иметь тип integer, возвращается ноль </blockquote>я решил не устанавливать подсказку типа возврата для этого метода получения, но потом понял, что проблема, вероятно, не в подсказке типа возврата, а в том, что я использую смешанные типы возврата. я помню, как читал где-то, что использование смешанных типов возврата - это плохо, но я не уверен, как справиться с этим без использования смешанных типов возврата. я мог бы: бросьте исключение в получателе и разработайте проверку в классе mapper так, чтобы он перехватывал это исключение. перехватите исключение typeerror и используйте его, чтобы указать, что идентификатор не установлен. сделайте свойство id общедоступным, чтобы я мог вызывать isset непосредственно для этого. добавьте другой метод hasid() return isset($this->id)</code></li> </ul><p>честно говоря, мне не очень нравятся эти решения, и мне было интересно, есть ли лучший вариант. какова лучшая практика для подобных случаев?</p><p>кроме того, я не должен получить typeerror, только если у меня включена строгая типизация? я думал, что php7 по умолчанию "слабые подсказки типа".</p>

<p>php 7.1 добавил <a href="http://wiki.php.net/rfc/nullable\_types">обнуляемые типы</a> , где вы ставите вопросительный знак перед именем типа, чтобы пометить возвращаемый тип как принимающий как этот тип, так и ноль:</p><pre><code>public function getid(): ?int { /* … */ } </code></pre><p>если вы все еще используете php 7.0, я предлагаю опустить объявление типа и использовать докблок.</p>

<p>использование <code>null</code> означает использование объектно-ориентированных подходов, потому что типы значений не могут быть нулевыми. так что может быть полезно использовать обертку класса вокруг целочисленного типа. например, <a href="http://php.net/manual/ru/class.splint.php">splint</a> из типов spl.</p>