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

时间:2015-05-15 09:37:27

标签: php function methods return code-standards

我正在重构一个广泛的代码库加班。从长远来看,我们将在课堂上开发整个系统,但与此同时,我正在利用这个机会来优化我的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

请尽量在您的解释中明确,我感兴趣的是您为什么选择自己喜欢的方法,以及如果有的话,让您选择其他方法。

6 个答案:

答案 0 :(得分:5)

我倾向于提前退货 - 只要你知道发生了什么就离开这个功能。如果称为“Guard Clause

,则使用此类用法

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

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

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

答案 1 :(得分:3)

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

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

在您的具体情况下,&#34;最好&#34 ;;您的代码应写为:

return $something > $somethingelse;

希望这可以作为一个例子,说明根本没有普遍适用的规则。

答案 2 :(得分:1)

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

在返回值的情况下,我猜是重要的事情 的可读性即可。有时松散一点也好 代码的性能,更易读和可维护 我将尝试展示一些有利有弊的例子。

方法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之外。

方法B

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

<强>优点:

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

<强>缺点:

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

方法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建议您创建 另一个处理所有嵌套块逻辑的函数。一个功能 应该是原子,它应该只做一件事。如果它做了太多的工作,有 太多的逻辑,很难维护和理解。创建其他功能 可能是个不错的选择。

方法C.2

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

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

<强>优点:

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

<强>缺点:

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

方法D

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

<强>优点:

  • 默认值。在这个结构中,我们可以看到处理默认值 从最开始。我们的功能中有逻辑,但如果我们输入no 分支我们还有一个价值。
  • 易于添加逻辑。如果我们需要添加一个分支if,这很容易,但事实并非如此 改变功能的结构。

<强>常数:

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

结论

我没有在这里列出所有可能的符号,只列出其中的一些。我们能做什么 想想他们是没有完美的,但在某些情况下似乎有一种方法 比另一个更好。例如, is_null 函数可以正常使用 接近B.

使用方法或其他方法取决于您,重要的是要做到 选择一个逻辑并在你的所有项目中保留它。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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

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