【问题标题】:What value should I return in case of error if I want to declare a function type in PHP? [duplicate]如果我想在 PHP 中声明一个函数类型,我应该在出错的情况下返回什么值? [复制]
【发布时间】:2021-10-21 05:36:33
【问题描述】:

我正在开发一个 PHP 项目并维护一个已有十年历史的应用程序。 在这个项目中,没有人使用过类型声明,但对我来说这似乎是一种很好的做法,我尝试(尽可能频繁地)编写干净的代码。 作为初级开发人员,当你的经理不关心良好实践时,这并不容易^^。

我正在编写一个应该返回一个对象的函数。

/**
 * Returns a coefficient object depending on the pack size given as an argument
 * @param int|null $pack_size
 * @return object
 */
function coefficient(int $pack_size = null) : object
{
    if (est_id($this->id))
    {
        // Checking that $pack_size is a number
        if (preg_match('`^[0-9]+(\.[0-9]+)?$`', $pack_size))
        {
            if (is_object($this->coefficient_group))
                $coefficient_resultSQL = coefficient::list(['group' => $this->coefficient_group->id(), 'size' => $pack_size]);
            if (!empty($coefficient_resultSQL->result))
            {
                $coefficient_src = reset($coefficient_resultSQL->result);
                $coefficient = new coefficient(null, ['element' => $coefficient_src]);
                
                if (!empty($coefficient) && est_id($coefficient->id()))
                    $result = $coefficient;
            }
        }
    }
    return (!empty($result)) ? $result : null;
}

问题是,通过将返回类型声明为对象,如果出现错误,我无法返回“null”。 那么,如果我想返回一个显式的错误值该怎么办呢? 非常感谢您的帮助!

【问题讨论】:

  • 虽然尝试遵循良好的实践很好,但如果不对代码库进行全面重构,您最终会使软件更难维护。在处理遗留代码时坚持已定义的实践是一个好主意。无论好坏。
  • 这在某种程度上确实是见仁见智。很多人会说你应该抛出一个异常,而不是诉诸于使用特定的值来表示错误条件。但话又说回来,如果您的应用程序遵循类似于上面显示的null 返回的一致方法,那么在代码可维护性等方面破坏它可能不是一个好主意。“良好实践”也是一个见仁见智的问题。类型检查可能很有用,但 PHP 又被设计为松散类型,有时这很有用。
  • 什么版本的 PHP?
  • 我们目前使用的是 PHP 7.3
  • 我想知道调用者会如何处理这个空值,除了将错误传播到调用链的下一级。无效结果至少有 4 个可能的原因。如果你问我,最好在此处调用一个紧急函数并强制调用者更正他们的代码,而不是默默地产生一个不可用的值。

标签: php types


【解决方案1】:

在 PHP 7 中,Type declarations for parameters and return values can now be marked as nullable by prefixing the type name with a question mark.

例如function coefficient(int $pack_size = null) : ?object

来自https://www.php.net/manual/en/migration71.new-features.php

【讨论】:

  • 谢谢,现在我知道我需要提高我的谷歌搜索技能了 :)
猜你喜欢
  • 2021-04-16
  • 1970-01-01
  • 2015-01-04
  • 2015-12-23
  • 2021-10-22
  • 1970-01-01
  • 2016-12-12
  • 2012-12-21
  • 2012-09-16
相关资源
最近更新 更多