【问题标题】:PHP return type hinting, object OR a boolean? [duplicate]PHP返回类型提示,对象或布尔值? [复制]
【发布时间】:2016-08-20 19:00:00
【问题描述】:

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

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

}

其中 User 是要返回的对象。

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

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

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

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

【问题讨论】:

  • 我总是觉得这样的问题很奇怪,因为我的第一反应总是“使用例外”。然后我记得例外是,像许多其他事情一样,PHP 中所谓的“红发继子”。
  • @IgnacioVazquez-Abrams PHP 通常只是采用另一种处理异常的方法。例如,Python 几乎将它们用于所有事情。 PHP 没有。异常通常相当慢也无济于事。
  • 从一个方法中明确地有两种不同的返回类型对我来说似乎总是有点味道。如果找不到用户(即:您返回false),您的调用代码需要做什么?这基本上是一个例外情况,所以我认为例外是处理它的更好方法。遗憾的是 PHP 没有空对象的概念:这将是比混合返回类型更好的方法。鉴于这不是一个选择:我认为例外是要走的路。

标签: php php-7 type-hinting


【解决方案1】:

您所说的称为联合类型。有considerable discussion about it in Internals

此 RFC 提出了为参数或返回类型定义多种可能类型的能力,并将它们称为“联合类型”。如果值将通过联合的任何成员,则该值通过联合类型的类型检查。在两种或多种类型之间放置一个竖线 (OR)。

这是一个接受数组或 Traversable 且不接受其他类型的参数示例:

function (Array | Traversable $in) {
    foreach ($in as $value) {
        echo $value, PHP_EOL;
    }
}

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

  1. 成功找到结果
  2. 成功找不到结果
  3. 出现错误

这都是针对 PHP 7.1 的,但尚未进行投票(更不用说看起来会通过了)。

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

/**
 * @param \PDO $pdo
 * @param string $username
 * @return User|false
 */

【讨论】:

  • 或者你可以抛出类似 Exception_NotFound() 的想法
  • 提案已投票,被拒绝。所以没有联合类型。
  • Version 2 of Union Types 已被投票通过。它将来到 PHP 8.0
猜你喜欢
  • 2021-04-11
  • 2017-10-15
  • 1970-01-01
  • 1970-01-01
  • 2017-02-08
  • 2012-04-14
  • 1970-01-01
  • 2012-05-10
相关资源
最近更新 更多