关于返回多个值的php风格

时间:2011-09-09 05:42:24

标签: php coding-style

也许这只是一个风格问题,或者也许是一个“正确”的答案。

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

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在某些方面似乎有点干净,因为它让调用者决定是否要修改它们的值。

然而,有时候ref似乎更合适,因为函数的意图实际上是用这些数据来捣乱。

混合和匹配怎么样?如果你有一个主要负责回馈一些数据的函数怎么办?但是在进程中可能有关于传入参数的其他信息呢?

2 个答案:

答案 0 :(得分:2)

我倾向于避免像瘟疫这样的参考参数:它们在你定义它们的时候显然是做什么的,但是大多数时候,你会看到它们的用法,而且还不清楚根本不论这些参数是参考还是按值。

坚持返回数组范式更具可读性,并且更容易避免副作用;它还允许嵌套/链接函数调用 - 这种样式在运行中看起来像这样:

$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);

答案 1 :(得分:1)

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