关于引用参数或显式返回值的 PHP 方法的最佳实践

Posted

技术标签:

【中文标题】关于引用参数或显式返回值的 PHP 方法的最佳实践【英文标题】:Best practice for PHP methods with regard to reference parameter or explicit return value 【发布时间】:2014-05-07 23:51:20 【问题描述】:

我已经多次使用这两种方法,但最近我想知道为什么我没有对其中一种方法进行标准化,或者是否有最佳实践以及背后的原因是什么。

虽然 php 的 returning references 页面非常清楚地说明了返回引用:

只有在您有正当的技术理由时才返回参考资料。

...passing by reference 页面在讨论参数和返回方法时不太清楚。

考虑以下两个例子:

参考回报

class foo 
    public static function bar(&$val) 
        $val++;
    


$input = 0;
foo::bar($input);
echo $input;  // outputs 1

显式返回

class foo 
    public static function bar($val) 
        $val++;
        return $val;
    


$input = 0;
$input = foo::bar($input);
echo $input;  // outputs 1

这两种方法执行相同的任务并返回相同的值,但它们完成它的方式略有不同。我知道这种情况(同一任务的多个解决方案)在 PHP 中很常见,但我的问题是......

以上两种方法中的一种是否优于另一种,如果是,为什么?


我应该指出,我确实看到过类似这样的其他问题:What's the difference between passing by reference vs. passing by value?,但它们处理的是效果和示例,而不是为什么一个比另一个更受欢迎。


编辑: 为了避免其他人阅读关于问题优点的长时间讨论的麻烦......

考虑到底层代码(无论是 PHP 还是 C)中固有的开销或优化,以及在转换为 OpCode 并置于可能数千应用服务器。小的优化可能会对月底的利润产生很大的影响。

我没想到会不情愿,但我的猜测是,乍一看,在考虑基本编程要求时并没有什么不同。我们的情况不同,所以我应该提前说得更具体。

如果其他人愿意称重,我会全力以赴。

【问题讨论】:

php return or reference? 的可能副本 @deceze 就像我在编辑中引用的另一个问题一样,它处理的是效果,而不是推理。我正在专门寻找最佳实践和有效的理由。我已经阅读了每一个答案,没有一个提供一个或另一个的具体原因,也没有提到最佳实践。您能否相应地删除关闭请求。 @deceze 来吧伙计,这不是同一个问题,其他人也没有得到我特别寻找的答案,或者费心为这个问题做任何工作。让我放松一下,让我得到我正在寻找的答案。 我认为欺骗中的答案完全符合。 API 设计由您决定。有些方法通过引用来接受和修改参数是有意义的,而另一些方法对于返回值更有意义。您认为这种解释有哪些不足之处? @deceze 您在引用问题中的回答只是为了方便起见,它没有提供有关预期用例、性能问题或在多种选择中选择一种或另一种的含义的任何参考的场景。它在哪里说明一种方法是修改,而另一种方法是派生?这实际上只是 OP 碰巧接受的一种观点,因为它与他的问题有关。就像你说的,这是一个 API 设计的问题,但我想更全面地了解它的含义。 【参考方案1】:

如前所述,这取决于您。 在我看来,显式返回总是最好的方法,所以如果你在 6 个月后回到你的代码,你不会问自己 $input var 是如何增加的!

当代码写成 10 行时,确实很容易找出代码的作用,但在处理更复杂的应用程序时则不然。

确实,您需要在显式返回中编写更多代码,但它更具可读性,并且在您之后的开发人员将很容易理解您所做的事情,这对于您的应用程序的可维护性非常重要。

【讨论】:

关于容易理解,只有混搭才对暗示。我正在寻找 OOP 意义上的一组通用原则......“这取决于你”很少是真的,几乎总是有最好的方法来做某事,PHP 只是让“它取决于你”。不一致是代码理解的唯一真正敌人。

以上是关于关于引用参数或显式返回值的 PHP 方法的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

JDK 8 函数式编程最佳实践

JDK 8 函数式编程最佳实践

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

返回多个值的Java方法的最佳实践? [复制]

C# 性能优化最佳实践

nhibernate - 通过更新父级或显式创建来创建子级?