1

我遇到了一个不寻常的场景,我的函数返回多种类型string or integer。我正在尝试声明返回类型。谁能建议我在这里宣布的最佳做法。

我知道 null 或其他类型我可以使用这样的东西

/**
 * Get the result status as a formatted string
 * @return string|null formatted status
 */
public function abStatus() : ?string {

但我的函数如下所示返回字符串或整数

/**
 * Get the score for this action
 * @return string|int
 */
public function getAlphaScore() {
    if ($this->type != self::TYPE_ACTION) {
        return 0;
    }
    if (empty($this->action->status < self::STATUS_IMPORTED) {
        return 'U';
    }

    return ActionCalculator::actionScore($this->action->score);//returns integer here
}

现在,我想知道我应该如何用返回类型声明我的函数

public function getAlphaScore() : string {

或者

 public function getAlphaScore() : int {

我也想知道在这种情况下的想法/建议/最佳实践,其中将返回多种返回类型

/**
 * @param $compareAction
 * @return float|int|null
 */
4

3 回答 3

1

“最佳”实践会说最好有一个一致的返回类型。当您没有严格的返回类型时,无法定义严格的返回类型。所以你在这种情况下是设计使然。

最好看看为什么你有这些不同的返回类型。然后你有一些选择。

  1. 我对逻辑并不完全清楚,但是抛出异常而不是返回是否更相关0

  2. 不是一个很好的解决方案,但如果第一个if返回null而不是0你可以使用可为空的返回类型,如?string

  3. 有两个功能有意义吗?getAlphaScoreAsInteger getAlphaScoreAsString. 当然,这取决于您要做什么

于 2019-05-10T13:32:54.747 回答
0

我建议最佳做法是只从方法或函数返回一种类型,而不是混合类型。

假设分数是整数或整数的字符串表示形式( 123 或 "123" ),然后决定您希望它使用哪种类型强制转换。

当您返回“U”时,我建议您转换为字符串。您可以使用 ctype_digit 添加检查以确保您的字符串在返回之前仅包含数字字符,如果不包含则抛出异常。

或者返回 null 而不是 'U' 并使用 ?int 注释。对返回值的严格检查将允许您将 null 变为“U”。

于 2019-05-10T13:42:48.490 回答
0

然后你不声明返回类型。

要么是要么stringint你不能同时拥有。

这就是 PHP 的弱类型化发挥作用的地方。

于 2019-05-10T13:29:53.860 回答