参数数组

时间:2009-07-21 16:35:36

标签: php cakephp

CakePHP大量使用关联数组将大量参数传递给函数。我还没有真正在PHP之外看过这种技术,并且从未看到它在Cake使用它的程度上使用过。我真的很喜欢这种方法,因为看起来在你自己的代码的未来版本中处理新参数会更容易,并且它比简单的一长串params更具可读性。

作为一个例子......

function myFunc($params = array('name' => 'rob', 'count' => 5, 'anArray' => array('A string', 5, myObject)))
{
    // ...
}

我想这与使用argc / argv类似,但更容易阅读。有没有人有这个方法的优缺点列表,或者知道有关这方面的最佳实践的人?我试过谷歌搜索它,但“关联参数数组”几乎带来了所有编写的编程文章。

此外,是否还有以这种方式传递参数的术语?

5 个答案:

答案 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

现在,我想到了一些利弊:

  • pro:您可以使用任意数量的参数,但仍然可以命名
    • 并且没有“列表末尾的唯一参数是optionnal”
  • con:phpdoc不合适:似乎只有一个参数,而且没有太多迹象表明它的作用
  • con(前一个的结果):当您使用带代码提示的IDE时,它无法显示每个参数的名称/描述:您始终必须查看文档。

单个“con”对我来说已足够了:如果没有其他(reallistic)方式,我只会使用这种传递参数的方式。