PHP возвращаемый тип намека, объект ИЛИ логический?

Итак, я знаю, что я могу возвращать тип намека на php7. Я могу сделать подсказку возврата объекта с помощью:

function getUser($pdo, $username) : User
{

}

где Пользователь является возвращаемым объектом.

Однако, если пользователь не найден в SQL, возврат 'false' вместо объекта User дает:

Uncaught TypeError: возвращаемое значение UserFind:: findUser() должно быть экземпляром User, boolean return

Но что, если SQL не может найти пользователя? Как я могу вернуть логическое, false, если пользователь не существует? Должен ли я просто игнорировать тип возвращаемого типа в этом сценарии?

EDIT: Я рассмотрел другой вопрос: "Нулевые типы возвращаемых данных в php 7", и, хотя мой вопрос почти идентичен, я хочу расширить свой вопрос, спросив, есть ли способ вернуть один из двух типов. Например, верните объект или строку, если объект небезопасен?

Ответ 1

То, о чем вы говорите, называется Union Type. Там значительное обсуждение об этом во внутренних документах

Этот 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
 */