在PHP函数/方法中返回的最佳实践

问题描述 投票:7回答:6

我正在重构一个广泛的代码库加班。从长远来看,我们将在课堂上开发整个系统,但与此同时,我正在利用这个机会来优化我的PHP技能并改进我们在数百个网站中使用的一些遗留代码。

我一直在阅读有关如何最好地从自定义函数返回数据的相互矛盾的文章,通常争论分为两类,即关注最佳技术实践的那些以及关注易于阅读和呈现的那些。

我对从自定义PHP函数返回时您认为最佳实践的观点(详细说明)感兴趣。

作为一个更好的标准,我不确定以下哪个是使用这个基本理论函数的例子;

接近a。

填充返回变量并在函数末尾返回它:

<?php
function theoreticalFunction( $var )
{
    $return = '';
    if( $something > $somethingelse ){
       $return = true;
    }else{
       $return = false;
    }
    return $return;
}
?>

方法b。

返回每个端点:

<?php
function theoreticalFunction( $var )
{
    if( $something > $somethingelse ){
       return true;
    }else{
       return false;
    }
}
?>

可能的重复可能是What is the PHP best practice for using functions that return true or false?然而,尽管我上面的基本例子,这并不仅仅是真或假。

我已经查看了PSR指南,但没有看到任何内容(但我可能已经错过了所以请随时指向PSR参考:))。

扩展原始问题:

根据预期/期望的输出类型,用于返回的方法是否不同?

此方法是否根据过程或面向对象编程方法的使用而改变?正如这个问题所示,面向对象带来了自己的怪癖,以进一步扩展可能的格式/表示选项Best practices for returns methods in PHP

请尽量清楚你的解释,我感兴趣的是你为什么选择你喜欢的方法,以及如果有的话,你选择了另一种方法。

php function methods return code-standards
6个回答
3
投票

有人争论功能中的单个退出点(最后只有一个return),还有其他人争论早期失败/返回。这只是个案意见和可读性/可理解性的问题。几乎没有客观的技术答案。

现实情况是,它根本不是可以教条地规定的东西。有些算法更好地表示为A,其他算法更好地表现为B.

在你的具体情况下,两者都不是“最好的”;您的代码应写为:

return $something > $somethingelse;

这有望成为一个例子,即根本没有普遍适用的规则。


5
投票

我倾向于提前退货 - 一旦你知道发生了什么就离开这个功能。这种用法的一种叫做'Guard Clause'

我经常做的其他事情包括删除最终的else默认值:

if ($something > $somethingelse) {
   return true;
}
return false;

事实上,形式if (boolean) return true; else return false的条件,甚至可以进一步缩短(如果你更清楚)到return ($something > $somethingelse);。从这样的代码中提取复杂的if子句到一个有用的命名函数可以帮助清除代码的含义。


1
投票

我知道这个问题已经过时了,但这很有意思,据我所知,有很多事情要说。 首先要说的是关于函数或方法的返回没有真正的标准。 它通常由你的团队决定遵循的规则来统治,但如果你是这个重构的唯一一个你可以做你想的更好。

在返回值的情况下,我认为重要的是可读性。有时,为了更易读和可维护的代码,最好放弃一点性能。 我将尝试展示一些有利有弊的例子。

Approach A

<?php
function getTariableType($var = null)
{
    if (null === $var) {
        return 0;
    } elseif (is_string($var)) {
        return 1;
    } else {
        return -1;
    }
}

优点:

  • 明晰。每个案例都解释自己,即使没有任何评论。
  • 结构体。每个案例都有一个分支,每个案例都有明确的分隔,并且很容易为新案例添加陈述。

缺点:

  • 可读性。带括号的所有这些if..else使代码难以阅读,我们真的必须注意每个部分要理解。
  • 不需要代码。最后的else语句不是必需的,如果return -1只是函数的最后一个语句,在任何else之外,代码将更容易阅读。

Approach B

<?php
function isTheVariableNull($var)
{
    return (null === $var);
}

优点:

  • 可读性。代码易于阅读和理解,首先我们知道函数正在检查变量是否为null。
  • 简明。只有一个声明,在这种情况下它很好而且清晰。

缺点:

  • 限制。这种表示法仅限于很少的功能。在更复杂的功能中使用这种符号甚至三元运算符变得更难理解。

Approach C.1

<?php
function doingSomethingIfNotNullAndPositive($var)
{
    if (null !== $var) {
        if (0 < $var) {
            //Doing something
        } else {
            return 0;
        }
    } else {
        return -1;
    }
}

优点:

  • 明晰。每个案例都是明确的,我们可以在阅读时重构函数的逻辑。

缺点:

  • 可读性。添加许多if..else语句时,代码实际上不太可读。然后,代码缩进很多次看起来很脏。想象一下这个代码有六个嵌套的if
  • 难以添加代码。因为逻辑似乎很复杂(即使它不是),所以很难在函数中添加代码或逻辑。
  • 很多逻辑。如果你有许多if..else嵌套,也许是因为你应该创建第二个函数。例如,NetBeans IDE建议您创建另一个处理所有嵌套块逻辑的函数。一个函数应该是原子的,它应该只做一件事。如果它做了太多的工作,有太多的逻辑,那么很难维护和理解。创建其他功能可能是一个不错的选择。

Approach C.2

这个approch旨在提供C.1表示法的替代方案。

<?php
function doingSomethingIfNotNullAndPositive($var)
{
    if (null === $var) {
        return -1;
    } elseif (0 >= $var) {
        return 0;
    }
    //Doing something
}

优点:

  • 可读性。这种表示法非常易读。我们很容易理解根据给定值得到的结果。
  • 明晰。作为C.1,这种方法在条件的每个分支中都是明确的。

缺点:

  • 难以添加逻辑。如果函数变得有点复杂,添加逻辑将很困难,因为我们可能需要移动条件的所有分支。

Approach D

<?php
function kindOfStrlen($var)
{
    $return = -1;
    if (is_string($var)) {
        $return = strlen($var);
    }
    return $return;
}

优点:

  • 默认值。在这个结构中,我们可以看到默认值从头开始处理。我们的函数中有逻辑,但是如果我们不进入分支,我们无论如何都有一个值。
  • 易于添加逻辑。如果我们需要添加一个分支if它很容易,它不会改变函数的结构。

常数:

  • 不需要变量。在这种情况下,不需要$return变量,我们会在不使用它的情况下编写相同的函数。解决方案最后是return -1,并在if中返回strlen($var),并且它的可读性不会那么低。

结论

我没有在这里列出所有可能的符号,只列出其中的一些。我们能想到的是没有完美的,但在某些情况下,一种方法似乎比另一种更好。例如,使用方法B,is_null函数就可以了。

使用方法或其他方法取决于您,重要的是选择逻辑并在所有项目期间保留它。


0
投票

使用方法b对我来说更好,因为在方法中你已经编写了很少的代码行,但如果有很多行代码和许多返回语句,那么我有可能在某处使用错误的返回类型,其中$返回被分配了一些其他地方,我没有注意到。


0
投票

我预先变种b。它不仅更具可读性(您确切地知道在return语句之后您不需要考虑任何剩余的代码),但它也更安全。

如果您在其余代码中遇到错误,或者遇到一组在设计系统时未考虑的条件,则可能会更改结果。使用return [$someVariable]退出函数时不会发生这种情况;


0
投票
<?php
function theoreticalFunction( $var )
{
    if( $something > $somethingelse ){
       return true;
    }
    return false;
}
?>

这种方法也可以用作RETURN语句,程序游标返回,下一个语句不会被执行。

© www.soinside.com 2019 - 2024. All rights reserved.