CakePHP大量使用关联数组将大量参数传递给函数。我还没有真正在PHP之外看过这种技术,并且从未看到它在Cake使用它的程度上使用过。我真的很喜欢这种方法,因为看起来在你自己的代码的未来版本中处理新参数会更容易,并且它比简单的一长串params更具可读性。
作为一个例子......
function myFunc($params = array('name' => 'rob', 'count' => 5, 'anArray' => array('A string', 5, myObject)))
{
// ...
}
我想这与使用argc / argv类似,但更容易阅读。有没有人有这个方法的优缺点列表,或者知道有关这方面的最佳实践的人?我试过谷歌搜索它,但“关联参数数组”几乎带来了所有编写的编程文章。
此外,是否还有以这种方式传递参数的术语?
答案 0 :(得分:5)
使用命名参数的缺点是使用PHPDoc记录参数。许多编辑器/ IDE提供“自动”文档,可以解析您的代码并生成通用文档块。
e.g。
function foo(array $bar, SomeClass $stuff) { returns $magic; }
会产生:
/**
* foo
*
* @param array $bar
* @param SomeClass $stuff
* @return mixed
*/
function foo(array $bar, SomeClass $stuff) { returns $magic; }
如果将所有参数放在$ params数组中,它只会看起来像
/**
* foo
*
* @param array $params
* @return mixed
*/
它还会给开发人员增加额外的负担,因为他们必须为每个参数键入额外的代码。我建议使用这两种方法的混合。
e.g。如果您有一个返回HTML文本输入元素的函数,则可以使用以下方法签名:
/**
* formText
*
* @param string $name name of text element
* @param string $value value of text element
* @param array $options additional options for text element
* @return string
*/
function formText($name, $value, $options = array());
因此,您可以轻松地将最常用的值传递给函数。
$this->formText('foo', 'Default...');
如果你需要额外的,不太常见的参数,你可以使用方便的命名参数语法:
$this->formText('foo', 'Default...', array(
'class' => 'bold highlighted'
));
否则,只使用通用的$ params数组,你必须输入:
$this->formText(array(
'name' => 'foo',
'value' => 'Default...'
));
答案 1 :(得分:3)
这是使用关键字参数的模拟。例如,在python中,您可以说:
myFunc(name="bob", age=10, gender="male")
由于PHP不支持这种语法,因此关联数组是次佳的。
答案 2 :(得分:3)
其他高级语言支持 named parameters 功能和方法。例如,在Python中,您可以调用:
my_func(name='rob', count=5, an_array=['A string', 5, my_object])
您所看到的是尝试在PHP中模拟此行为。好处是显而易见的。
一个缺点可能是每次方法调用都需要哈希表查找,但是根据PHP中如何处理参数,性能损失可以忽略不计。
答案 3 :(得分:1)
这是在PHP中执行named parameters的唯一方法。
只有拥有大量参数IMO才有用。否则,明确定义的参数签名的好处是更好的选择,特别是如果您使用“intellisense”能力的IDE。
答案 4 :(得分:1)
这种技术(实际上)经常在Javascript中使用,带有对象(当你使用字符串作为键时,在JS中,你使用的是对象,而不是数组);例如,请参阅scriptaculous Draggable。
现在,我想到了一些利弊:
单个“con”对我来说已足够了:如果没有其他(reallistic)方式,我只会使用这种传递参数的方式。