7

当有一个函数需要传递多个参数时,比如七个参数,这是比较好的做法:

function foo($par1, $par2, $par3, $par4, $par5, $par6, $par7)
{
}

或者

function foo(array $args)
{
}

在第二个示例中$args,将参数作为元素的数组。

我一直不一致地使用这两种方法。

使用第一种方法的缺点是,如果你弄错了参数的顺序,你就完蛋了(而且它可能真的很难调试,因为它并不总是很明显)。这就是使用数组方法的优点。

使用第一种类型的优点(恕我直言)是一个好的 PHP 编辑器(例如 PhpStorm)会在您键入函数时向您显示参数的名称,这比进入函数查看需要传递的参数更容易在一个数组中。

感谢您的建议。

4

3 回答 3

7

从理论上讲,每个参数都应该包含一个逻辑整体。集合旨在表示值的集合,而不是方法参数的集合;各个参数应单独传递,以清楚地表明该方法的用途。

实际上,在数组中传递参数时,您必须进行大量手动检查以确保传递了正确的参数。通过为参数提供清晰的逻辑名称(以及可能的类型提示),您几乎可以避免任何歧义。此外,正如评论已经指出的那样,如果一个方法需要 7 个参数,那么进行一些重构可能已经成熟了。

编辑:如果您的方法/函数确实接受了一组模糊定义的“选项”,这些“选项”仅以较小的方式影响代码的作用,请考虑使用 Symfony OptionsResolver组件,以大大简化选项数组的验证。

于 2012-09-25T20:56:43.870 回答
1

我认为这个问题可以归结为“php 的类型有多强?” “我希望我的东西有多强的类型?”

显然,数组是最松耦合的。变量的数量及其名称由调用者完成。

您使用单独参数的调用具有更强的耦合性,因此必须至少提供参数数量。

恕我直言,您忘记了一种呼叫,那就是type hinting. 这是 php 目前提供的最强大的强类型化方法。

例子:

function foo(\MyNamespace\MyObject $par1, \YourNamespace\YourObject $par2)
{
}

我的观点:由于我只有强类型语言的背景,我更喜欢强类型typed hinting。有传言说 php 5.5 或 php 6 也将支持标量作为类型提示。

于 2012-09-25T20:59:59.900 回答
0

如果您有很多基于参数的选项或想要更多的灵活性,请尝试func_get_args()

function foo()
{
    $arg_list = func_get_args();
    for ($i = 0; $i < $numargs; $i++) {
        echo "Argument $i is: " . $arg_list[$i] . "<br />\n";
    }
}

如果您想缩小可接受的参数范围,那么最好定义变量。

于 2012-09-25T20:56:54.213 回答