PHP将数组传递给函数

时间:2011-09-26 18:08:20

标签: php function

我见过一些人问过类似的问题。但我确实需要对这一特定主题做一点澄清。

我有几个传递几个参数的函数。我甚至有一些约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

}

所以,我正在寻找其他选项和更好的想法,以便通过增加参数列表来处理函数。

9 个答案:

答案 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适用吗?

顺便说一下,R​​efactoring很棒!

答案 4 :(得分:0)

根据函数的用途,有时传递对象是合适的。

答案 5 :(得分:0)

我们不要谈论解决方案#1。你已经说过它很糟糕......

我喜欢传入这个哈希/关联数组的第二个想法。感觉像rubylike :) 你正在做的事情是你放弃了一些免费获得的支票。如果你调用一个函数并忘记一个参数,那么运行时会抱怨并且脚本会停止执行。 在您的场景中,您必须在函数内执行所有这些检查:是否提供了所有必要的选项?这些值是正确的类型等吗?

我想说,如果只是你在编写代码,那么这个决定取决于你的品味。 如果其他人与你合作,我会询问他们的意见。在那之前,我会坚持使用带有7个参数的函数的经典方法

答案 6 :(得分:0)

带有键作为参数名称的关联数组,顺序不计算(不要忘记你记录了预期的键):

function myFunc(array $args)
{
    # default values
    $args += array('arg1' => 'default1', 'arg2' => 'default2');
}

有时您想验证是否也从输入中删除了所有不重要的键。一个有用的功能是array_intersect_keyDocs

答案 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可以帮助提供函数调用帮助。

基本上,如果它是必需的参数,它应该在函数签名中。