将参数数组与单个参数传递给PHP中的函数?

时间:2012-09-25 20:51:39

标签: php function parameters coding-style

当有一个需要传递大量参数的函数时,例如七个参数,这是更好的做法:

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

function foo(array $args)
{
}

第二个示例中$args的位置是一个以参数为元素的数组。

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

使用第一种方法的缺点是,如果你得到一个参数的顺序错误,你就搞砸了(而且它很难调试,因为它并不总是很明显)。这是使用数组方法的优势。

使用第一种类型的优点(恕我直言)是一个好的PHP编辑器,如PhpStorm将在你输入函数时显示参数的名称,这比去函数看看需要什么参数更容易以数组形式传递。

感谢您的建议。

3 个答案:

答案 0 :(得分:5)

理论上,每个参数都应该包含一个逻辑整体。集合旨在表示值的集合,而不是方法参数的集合;各个参数应分别通过,以明确指出方法的目的。

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

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

答案 1 :(得分:1)

我认为这个问题归结为“有多强类型是php?”“我希望我的内容有多强大?”

很明显,阵列是最松散耦合的。变量的数量及其名称在调用者之前完成。

您使用单独参数进行的调用会更强一些,因此必须至少提供参数数量。

恕我直言,你忘了一种类型的电话,那就是type hinting。这是目前php提供的最强大的强类型方式。

示例:

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

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

答案 2 :(得分: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";
    }
}

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