方法 1:
function myfunc($arg1, $arg2, $arg3)
方法2:
// where $array_params has the structure array('arg1'=>$val1, 'arg2'=>$val2, 'arg3'=>$val3)
function myfunc($array_params)
什么时候应该使用一种方法而不是另一种?如果系统需求不断变化,并且因此myfunc的参数数量也在变化,那么使用方法1可能需要很多维护。
方法 1:
function myfunc($arg1, $arg2, $arg3)
方法2:
// where $array_params has the structure array('arg1'=>$val1, 'arg2'=>$val2, 'arg3'=>$val3)
function myfunc($array_params)
什么时候应该使用一种方法而不是另一种?如果系统需求不断变化,并且因此myfunc的参数数量也在变化,那么使用方法1可能需要很多维护。
我发现在函数中使用一个可选的参数数组非常有用,当我想要覆盖函数中的一组默认值时。当构建具有许多不同配置选项或仅是信息的哑容器时,这可能会很有用。这是我主要从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));
请注意,$options的初始值是一个空数组,所以提供它是可选的。
此外,使用这种方法,我们知道$options将始终是一个数组,我们知道这些键有默认值,因此在引用参数时不需要不断地检查is_array()
或isset()
。
$config = array_merge($options, $defaults);
。因为在 array_merge
函数中,第一个数组的元素优先于第二个数组使用,如果存在匹配的键。否则,默认值将始终覆盖选项。 - harryg如果输入数组具有相同的字符串键,则该键的后一个值将覆盖先前的值。然而,如果数组包含数字键,则后一个值将不会覆盖原始值,而是被追加到后面。
- user2340612使用第一种方法,您强制函数的用户提供所需的所有参数。而使用第二种方法,您不能确定是否已获取了所有需要的参数。我更喜欢第一种方法。
如果你传递的参数可以在逻辑上分组,你可以考虑使用参数对象(《重构》Martin Fowler,第295页),这样如果你需要添加更多的参数,你只需要向参数类中添加更多的字段,就不会破坏现有的方法。
每种方法都有其优缺点。
如果是一个简单的函数,不太可能改变,并且只有几个参数,则应明确声明它们。
如果函数有大量参数或将来可能经常更改,则应传递带有键的参数数组并使用它。如果您有一个只需要经常传递一些参数的函数,这也会很有帮助。
我选择数组而不是参数的示例是创建表单字段的函数:
我可能只需要传递其中的一些参数。例如,如果字段类型为文本,则不需要选项。我可能不总是需要类或默认值。这样,可以轻松地传递多种参数组合,而无需具有大量参数的函数签名并始终传递null。此外,当HTML 5在许多年后成为标准时,我可能想添加其他可能的参数,例如打开或关闭自动完成。
我知道这是一个旧帖子,但我想分享我的方法。如果变量在类型上逻辑连接,您可以将它们分组到一个类中,并将其对象传递给函数。例如:
class user{
public $id;
public $name;
public $address;
...
}
并调用:
$user = new user();
$user->id = ...
...
callFunctions($user);
function(null,null,null,null,null,"hello");
。 - Pekkafunction_name(, , , , , , $value);
会更简单。 - Lee Blake