函数简化参数列表

时间:2012-04-11 09:55:02

标签: php

调用函数时有没有办法简化参数列表?而不是使用$blank

$subscribe=1;
    $database->information($blank,$blank,$blank,$blank,$blank,$blank,$subscribe,$blank,$blank,$blank,$blank,$blank);



    function information ($search,$id,$blank,$category,$recent,$comment,$subscribe,$pages,$pending,$profile,$deleted,$reported) {
    //code
    }

6 个答案:

答案 0 :(得分:2)

是的,改为传递数组,或重构。长参数列表通常是难闻的气味。

function information(array $params) {....

information(array('search'=>'.....

答案 1 :(得分:2)

对于一个函数,十二个参数通常太多。通过重构可能是怪物的function information,可能会简化您的代码(包括缩短参数列表)。

您可以在此期间使用的权宜之计措施

  • 添加默认参数值
  • 使函数接受所有参数作为数组

以上两种情况都要求您访问所有调用网站以供审核和修改。

添加默认参数是恕我直言,这是一个糟糕的选择,因为通过查看示例调用,似乎你需要使所有参数默认,这反过来意味着编译器永远不会警告你如果你错误地调用了这个函数。

转换为数组更有效,但它会强制您以不会出现意外错误的方式重写调用。函数签名将更改为

function information(array $params)

或可能

function information(array $params = array())

如果您希望所有参数都是可选的。您可以使用

为参数提供默认值
function information(array $params) {
    $defaults = array('foo' => 'bar', /* ... */);
    $params += $defaults; // adds missing values that have defaults to $params;
                          // does not overwrite existing values

为了避免重写函数体,您可以使用export将这些值从数组中提取到本地范围:

    export($params); // creates local vars
    echo $foo; // will print "bar" unless you have given another value

<强> See all of this in action

答案 2 :(得分:2)

您可以传入具有指定键的数组,并将其与默认值数组合并

所以而不是

function foo($arg1 = 3, $arg2 = 5, $arg3 = 7) { }

你有

function foo($args) {
   $defaults = array(
      'arg1' => '',
      'arg2' => null,
      'arg3' => 7
   );

   // merge passed in array with defaults
   $args = array_merge($defaults, $args);

   // set variables within local scope
   foreach($args as $key => $arg) { 
       // this is to make sure that only intended arguments are passed
       if(isset($defaults[$key])) ${$key} = $arg; 
   }

    // rest of your code
}

然后将其称为

foo(array('arg3' => 2));

答案 3 :(得分:0)

你可以这样做,所以函数会自动用给定的值填充变量,如空字符串:

function information ($subscribe, $search="", $id="", $blank="", $category="", $recent="", $comment="", $pages="", $pending="", $profile="", $deleted="", $reported="") {
    //code
}

答案 4 :(得分:0)

是的,有几种方法:

  • 接受关联数组作为单个参数,并将您需要的内容传递给它。如果缺少关键参数,则抛出异常。
  • 将关键参数放在函数定义的头部,最后放置可选的参数。给它们一个默认值,这样你就不必声明它们。
  • 重新调整您的功能。对于一个函数,12个参数太多了。考虑使用类/对象,或者在不同函数之间划分工作。

答案 5 :(得分:0)

有几种方法:

function test($input = "some default value") {
    return $input; // returns "some default value"
}

function test($input) {
    return $input;
}

test(NULL); // returns NULL

function test() {
   foreach(func_get_args() as $arg) {
       echo $arg;
   }
}

test("one", "two", "three"); // echos: onetwothree