PHP返回类型提示,对象还是一个布尔值?

lif*_*ife 18 php type-hinting php-7

所以我知道我可以在php7中做返回类型提示.我可以做一个对象返回提示:

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

}
Run Code Online (Sandbox Code Playgroud)

其中User是要返回的对象.

但是,如果在SQL中找不到用户,则返回'false'而不是User对象给出:

未捕获的TypeError:UserFind :: findUser()的返回值必须是User的实例,返回布尔值

但是如果SQL无法找到用户怎么办?如果用户不存在,我怎么能返回一个布尔值false?在这种情况下,我应该忽略返回类型提示吗?

编辑:我看了另一个问题,"在PHP 7中可以为Nullable返回类型",虽然我的问题几乎相同,但我想通过询问是否有办法返回两种类型中的一种来扩展我的问题.例如,如果对象不存在,则返回一个对象或一个字符串?

Mac*_*ity 19

你所说的是一种联盟类型.在Internals中相当多的讨论

此RFC建议能够为参数或返回类型定义多个可能的类型,并将其称为"联合类型".如果值将传递union中的任何一个成员,则值将传递union类型的类型检查.垂直条(OR)放置在两种或更多种类型中的每一种之间.

以下是接受数组或Traversable而不包含其他类型的参数示例:

function (Array | Traversable $in) {
    foreach ($in as $value) {
        echo $value, PHP_EOL;
    }
}
Run Code Online (Sandbox Code Playgroud)

在联合中可以有两种以上的类型.例如,与数据库交互的例程通常具有以下三种结果之一:

  1. 成功找到了结果
  2. 成功找不到任何结果
  3. 有一个错误

这一切都针对PHP 7.1,但尚未投票(更不用说看起来会通过).

那么你的问题呢?我会说,至少现在,不要输入提示你的回报.只需发出一个文件块,说它可以返回Userfalse

/**
 * @param \PDO $pdo
 * @param string $username
 * @return User|false
 */
Run Code Online (Sandbox Code Playgroud)

  • 或者您可以抛出类似Exception_NotFound()的想法 (2认同)
  • 该提议已被表决,但被拒绝。因此,没有联合类型。 (2认同)
  • [Union Types 版本 2](https://wiki.php.net/rfc/union_types_v2) 已投票通过。PHP 8.0 将会到来 (2认同)