2012-09-25 156 views
5

当存在需要被传递的若干参数的函数,例如七个参数,这是更好的做法:将参数数组与参数传递给PHP中的函数?

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

function foo(array $args) 
{ 
} 

凡在本第二示例$args将参数为元素的数组。

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

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

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

感谢您的建议。

+0

在项目环境中,您曾经为您工作过。 – 2012-09-25 20:52:52

+0

如果您有7个参数的功能,它可能有太多的责任。 –

回答

4

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

实际上,在数组中传递参数的时候,你必须做一吨的人工检查,以确保正确的参数已经过去了。你可以通过给你的参数清楚,逻辑名称(和可能的字体提示)来避免非常多的歧义。另外,正如已经说过的评论,如果一个方法需要7个参数,那么对于一些重构可能已经成熟。

编辑:如果你的方法/函数确实接受一组影响的代码不会只在一个较小的方式是什么定义模糊的“选项”,可以考虑使用的Symfony OptionsResolver组件,大大减轻你的选择验证阵列。

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"; 
    } 
} 

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

1

我认为这个问题可以归结为“如何强类型是php?”“我想让自己的东西变得多强有力?”

明显,该阵列是最松耦合。变量和它们的名字的数量完全由调用者决定。

您与单独的参数调用是一点点的强耦合,因此必须有至少提供的参数的数量。

恕我直言,你忘了一个类型的主叫的,那就是用type hinting。这是目前php提供的最强大的打字方式。

例如:

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

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