我见过一些人问过类似的问题。但我确实需要对这一特定主题做一点澄清。
我有几个传递几个参数的函数。我甚至有一些约10个论点。 (最初没有计划,只是随着时间的推移而增长)
查看我的源代码以查找第7个参数是什么没有任何问题,但它确实变得单调乏味。大多数时候我都知道要传递什么参数,而不是位置。
我有一些想法可以简化这个过程。
a)传递1个参数,但用一些分隔符除以一切。 (但这是一个坏主意!,因为我仍然需要记住每个人的位置。
function myfunc('data|data|data|'){
// explode the string
}
b)传递一个带有键和值的数组,并在我的函数中查找键名,并采取相应的行动。
function myfunc(array('arg1' => 'blah blah', 'arg2' => 'more blah')){
// loop through the array
}
c)保持原样。
function myfunc($arg1,$arg2,$arg3,$arg4,$arg5........){
// yay
}
所以,我正在寻找其他选项和更好的想法,以便通过增加参数列表来处理函数。
答案 0 :(得分:8)
在我看来,最好的方法是传入一个关联数组。这样你就可以立即看到每个参数的作用。请务必以描述性方式命名,而不是arg1
& arg2
。
关联数组的另一个优点是,您不必关心传递参数的顺序。
请记住,如果使用关联数组,则会失去PHP本地分配默认值的方式,例如:
function doSomething($arg1 = TRUE, $arg2 = 55) { }
因此,您需要做的是创建自己的一组默认选项,然后合并您的数组:
function doSomething( $props = array() )
{
$props = array_merge(array(
'arg1' => TRUE,
'arg2' => 55
), $props);
// Now use the $props array
}
答案 1 :(得分:2)
使用myfunc($options)
表单。将array_merge_recursive
与默认选项数组一起使用,您将成为黄金。
答案 2 :(得分:2)
b)(关联数组)是迄今为止最简单,最具适应性的(因为它允许模拟默认关键字参数),并且最不易出错的变体。
答案 3 :(得分:1)
首先,看看你是否可以introduce paramter object。替换所有7个参数并不是必要的,但也许你可以降低它们的数量。
接下来,检查函数本身 - 为什么它需要这么多参数,也许只是对很多事情做了什么? Replace parameter with method / Replace parameter with explicit method适用吗?
顺便说一下,Refactoring很棒!
答案 4 :(得分:0)
根据函数的用途,有时传递对象是合适的。
答案 5 :(得分:0)
我们不要谈论解决方案#1。你已经说过它很糟糕......
我喜欢传入这个哈希/关联数组的第二个想法。感觉像rubylike :) 你正在做的事情是你放弃了一些免费获得的支票。如果你调用一个函数并忘记一个参数,那么运行时会抱怨并且脚本会停止执行。 在您的场景中,您必须在函数内执行所有这些检查:是否提供了所有必要的选项?这些值是正确的类型等吗?
我想说,如果只是你在编写代码,那么这个决定取决于你的品味。 如果其他人与你合作,我会询问他们的意见。在那之前,我会坚持使用带有7个参数的函数的经典方法
答案 6 :(得分:0)
带有键作为参数名称的关联数组,顺序不计算(不要忘记你记录了预期的键):
function myFunc(array $args)
{
# default values
$args += array('arg1' => 'default1', 'arg2' => 'default2');
}
有时您想验证是否也从输入中删除了所有不重要的键。一个有用的功能是array_intersect_key
Docs。
答案 7 :(得分:0)
查看这篇关于在PHP中创建省略号的帖子 Creating an ellipsis in PHP
答案 8 :(得分:0)
function myfunc($ arg1,$ arg2,$ arg3,$ arg4,$ arg5 ........){
由于提供的信息有限,我不得不说保持原样。原因是你的函数签名显示你的参数都没有默认值(它们都是必需的)。
如果你把它作为一个关联数组,那么你就删除了解析器警告不良函数的能力,即:
Missing argument 2 for some_function, called in [etc.]
如果您无法记住所有参数,IDE可以帮助提供函数调用帮助。
基本上,如果它是必需的参数,它应该在函数签名中。