我的PHP函数应该接受一个参数数组还是应该显式请求参数?

Joh*_*ohn 37 php overloading

在我正在研究的PHP Web应用程序中,我看到以两种可能的方式定义函数.

方法1:

function myfunc($arg1, $arg2, $arg3)
Run Code Online (Sandbox Code Playgroud)

方法2:

// where $array_params has the structure array('arg1'=>$val1, 'arg2'=>$val2, 'arg3'=>$val3)
function myfunc($array_params)
Run Code Online (Sandbox Code Playgroud)

什么时候应该使用一种方法而不是另一种 似乎如果系统要求不断变化,因此myfunc的参数数量不断变化,方法1可能需要大量维护.

Joh*_*ker 29

如果系统经常变化以至于使用索引阵列是最佳解决方案,我会说这是您最不担心的问题.:-)

一般来说,函数/方法不应该使用太多的参数(5加或减2是最大值),我会说你应该坚持使用命名(和理想的类型提示)参数.(如果存在大量可选数据,则索引的参数数组才有意义 - 一个很好的示例是配置信息.)

正如@Pekka所说,传递一系列论点也很难记录下来,因此对于其他人/你自己来说,要保持这种状态.

更新ETTE ...

顺便提一下,经常提到的" Code Complete"这本书很详细地研究了这些问题 - 这是我非常推荐的一本很棒的书.

  • +1好点.尽管使用配置数组并不一定表示设计不佳:有时,您只需要设置1个或2个参数,以及哪些参数可以更改.并且没有人喜欢(夸大的)`函数(null,null,null,null,null,"hello"); (8认同)
  • 是的,这里也一样.正确的解决方案是在编程语言中引入真实的(自由排序的)命名参数,但据我所知,PHP团队已经反复拒绝了这一点. (3认同)

Pek*_*ica 17

使用params数组(在其他语言中代替所谓的"命名参数")很棒 - 我喜欢自己使用它 - 但它有一个非常大的缺点:参数不能使用标准的phpDoc表示法记录,并且因此,当您键入函数或方法的名称时,IDE将无法提供提示.


Bry*_* M. 13

当我想要覆盖函数中的一组默认值时,我发现使用可选的参数数组非常有用.在构造具有许多不同配置选项的对象或者只是用于信息的哑容器时,它可能很有用.这是我主要从Ruby世界中学到的东西.

例如,如果我想在我的网页中为视频配置容器:

function buildVideoPlayer($file, $options = array())
{
  $defaults = array(
    'showAds' => true,
    'allowFullScreen' = true,
    'showPlaybar' = true
  );

 $config = array_merge($defaults, $options);

 if ($config['showAds']) { .. }
}

$this->buildVideoPlayer($url, array('showAds' => false));
Run Code Online (Sandbox Code Playgroud)

请注意,$ options的初始值是一个空数组,因此提供它是可选的.

此外,使用此方法我们知道$ options将始终是一个数组,并且我们知道这些键具有默认值,因此我们不需要经常检查is_array()isset()引用参数.

  • 旧的答案我知道,但你的代码应该是`$ config = array_merge($ options,$ defaults);`因为如果有匹配的键,`array_merge`函数中第一个数组的元素将在第二个数组中使用.否则,默认值将始终覆盖选项 (2认同)
  • 我不知道最近是否有变化,但似乎布莱恩的回答是正确的.从文档引用:`如果输入数组具有相同的字符串键,则该键的后一个值将覆盖前一个键.但是,如果数组包含数字键,则后面的值不会覆盖原始值,但会附加.` (2认同)

小智 5

使用第一种方法,您将迫使函数的用户提供所需的所有参数。第二种方式你不能确定你得到了你需要的一切。我更喜欢第一种方法。