Поэтому я знаю, что могу возвращать тип намека на php7. Я могу сделать подсказку с объектом:
function getUser($pdo, $username) : User { }
где Пользователь является возвращаемым объектом.
Однако, если пользователь не найден в SQL, возвращающий 'false'
вместо объекта User дает:
Uncaught TypeError: возвращаемое значение UserFind :: findUser () должно быть экземпляром User, boolean возвращено
Но что, если SQL не может найти пользователя? Как я могу вернуть логическое, false, если пользователь не существует? Должен ли я просто игнорировать тип возвращаемого типа в этом сценарии?
EDIT: Я рассмотрел другой вопрос: «Нулевые типы возвращаемых данных в php 7», и хотя мой вопрос почти идентичен, я хочу расширить свой вопрос, спросив, будет ли когда-нибудь возвращаться один из двух типов. Например, верните объект или строку, если объект небезопасен?
То, о чем вы говорите, называется Union Type. Об этом много говорят в Internals
Этот RFC предлагает возможность определять несколько возможных типов для параметра или возвращаемого типа и называет их «типами объединения». Значение передает проверку типа для типа объединения, если значение передало бы один из членов объединения. Вертикальная полоса (OR) помещается между каждым из двух или более типов.
Ниже приведен пример параметра, принимающего либо массив, либо Traversable, либо других типов:
function (Array | Traversable $in) { foreach ($in as $value) { echo $value, PHP_EOL; } }
В союзе может быть более двух типов. В качестве примера, это несколько обычное явление для подпрограммы, которая взаимодействует с базой данных, чтобы иметь один из трех результатов:
- Успешно найдены результаты
- Успешно не найдено результатов
- Там была ошибка
Все это нацелено на PHP 7.1, но пока не готово к голосованию (не говоря уже о том, как он пройдет).
Так как насчет вашей проблемы? Я бы сказал, по крайней мере пока, не набирайте намек на свое возвращение. Просто выпустите блок doc, который говорит, что он может вернуть User
или false
/** * @param \PDO $pdo * @param string $username * @return User|false */