参数数组

rob*_*408 2 php cakephp

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

举个例子...

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

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

此外,是否有一个通过这种方式传递参数的术语?

hob*_*ave 5

使用命名参数的缺点是使用PHPDoc记录参数.许多编辑器/ IDE提供"自动"文档,可以解析您的代码并生成通用docblock.

例如

function foo(array $bar, SomeClass $stuff) { returns $magic; }
Run Code Online (Sandbox Code Playgroud)

会产生:

/**
 * foo
 *
 * @param array $bar
 * @param SomeClass $stuff
 * @return mixed
 */
function foo(array $bar, SomeClass $stuff) { returns $magic; }
Run Code Online (Sandbox Code Playgroud)

如果将所有参数放在$ params数组中,它只会看起来像

/**
 * foo
 *
 * @param array $params
 * @return mixed
 */
Run Code Online (Sandbox Code Playgroud)

它还会给开发人员增加额外的负担,因为他们必须为每个参数键入额外的代码.我建议使用这两种方法的混合.

例如,如果您有一个返回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());
Run Code Online (Sandbox Code Playgroud)

因此,您可以轻松地将最常见的值传递给函数.

$this->formText('foo', 'Default...');
Run Code Online (Sandbox Code Playgroud)

如果你需要额外的,不太常见的参数,你可以使用方便的命名参数语法:

$this->formText('foo', 'Default...', array(
    'class' => 'bold highlighted'
));
Run Code Online (Sandbox Code Playgroud)

否则,只使用通用的$ params数组,你必须键入:

$this->formText(array(
    'name' => 'foo',
    'value' => 'Default...'
));
Run Code Online (Sandbox Code Playgroud)