关于返回多个值的PHP样式


php style about returning multiple values

也许这只是一个文体问题,或者也许有一个"正确"的答案。

如果我有一个php函数需要返回多个值(这些是传入参数),这是首选:

function myFuncReturnVals ($a, $b) {
 // do stuff
 return array ($a, $b)
}
function myFuncByRef (&$a, &$b) {
 // do stuff
}
list($a,$b) = myFuncReturnVals ($a,$b);
myFuncByReb($a,$b);

两种方法都能完成工作,但哪一种更可取呢?

ReturnVals在某些方面似乎更干净一些,因为它让调用者决定是否要修改它们的值。

然而,有时by ref似乎更适合,因为函数的目的实际上是处理该数据。

那混搭呢?如果您有一个函数主要负责返回一些数据,但在处理过程中可能有关于传入参数的附加信息,该怎么办?

我倾向于像避免瘟疫一样避免引用形参:在定义它们的时候,它们的作用很明显,但大多数时候,您将查看它们的用法,并且根本不清楚这些形参是按引用还是按值。

坚持return-a -array范式更具可读性,并且更容易避免副作用;它还允许嵌套/链接函数调用——这种样式看起来像这样:

$output = nl2br(
          detect_links(
          htmlspecialchars(
          trim($input))))

如果你有多个函数返回相同类型的值集合,可能值得将它们包装在一个类中——这样,即使没有(phpdoc)注释,你的返回值也会变得更具描述性,并且你可以通过在函数参数中添加类型提示来捕获其他函数的无效输入。

另外,要注意对象已经是引用类型了,所以只有当你想替换整个对象时才有意义——改变单个字段或调用破坏性方法会改变原始对象,即使你是按值传递的。例子:

<?php
class Bar {
    public $x;
    public function __construct($x) { $this->x = $x; }
}
function foo($bar, $x) {
    $bar->x = $x;
}
$myBar = new Bar(23);
$foo($myBar, 42);
printf("$foo->x is now %s'n", $foo->x);

选择。使用与你的编码风格一致的方法。我宁愿返回一个数组