代码之家  ›  专栏  ›  技术社区  ›  rob5408

参数数组

  •  2
  • rob5408  · 技术社区  · 17 年前

    CakePHP大量使用关联数组向函数传递大量参数。在PHP之外,我还没有真正见过这种技术,也从未见过像Cake那样使用它。我非常喜欢这种方法,因为在您自己的代码的未来版本中处理新参数似乎更容易,而且它比简单地列出一长串参数可读性更好。

    例如。。。

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

    还有,是否有这样一个术语来传递参数?

    5 回复  |  直到 17 年前
        1
  •  5
  •   hobodave    17 年前

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

    例如

    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
     */
    

    /**
     * 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'
    ));
    

    $this->formText(array(
        'name' => 'foo',
        'value' => 'Default...'
    ));
    
        2
  •  3
  •   gahooa    17 年前

    这是对使用关键字参数的模拟。例如,在python中,您可以说:

    myFunc(name="bob", age=10, gender="male")
    

    因为PHP不支持这种语法,所以关联数组是次好的选择。

        3
  •  3
  •   sixthgear    17 年前

    其他高级语言支持 named parameters

    my_func(name='rob', count=5, an_array=['A string', 5, my_object])
    

    您看到的是在PHP中模拟这种行为的尝试。好处是显而易见的。

    • 灵活性
    • 无需知道预期参数的顺序/数量

    一个缺点可能是每个方法调用都需要哈希表查找,但根据PHP中参数的处理方式,性能影响可能可以忽略不计。

        4
  •  1
  •   Peter Bailey    17 年前

    这是唯一的办法 named parameters 在PHP中。

    在我看来,只有当您有大量参数时,它才有用。否则,显式定义的参数签名的好处是更好的选择,特别是当您使用具有“智能感知”功能的IDE时。

        5
  •  1
  •   Pascal MARTIN    17 年前

    这种技术(实际上)经常在Javascript中使用,对象(当您使用字符串作为键时,在JS中,您使用的是对象,而不是数组);有关示例,请参见 scriptaculous Draggable

    现在,让我们立即想到几个正反两方面的问题:

    • 赞成:您可以使用任意数量的参数,并且仍然可以命名它们
      • 并且没有“只有列表末尾的参数是可选的”
    • 缺点:phpdoc不好:似乎只有一个参数,没有太多关于它的指示
    • con(前一个的结果):当您使用带有代码提示的IDE时,它无法显示每个参数的名称/描述:您必须始终检查文档。

    这一个“con”对我来说已经足够了:只有在没有其他(现实主义)方法的情况下,我才使用这种方法来传递参数。