使用数组作为PHP函数中的默认参数

时间:2013-01-22 10:45:08

标签: php arrays

是否可以在PHP函数中使用数组作为默认参数?

我想做以下事情:

$arr = array(1,2,3,4);

function sample($var1, $var2, $var3 = $arr){
    echo $var1.$var2;
    echo print_r($var3);
}

sample('a','b');
// Should still work without the third parameter and default to $arr

4 个答案:

答案 0 :(得分:22)

不,这是不可能的,默认值的右手表达式必须是常量或数组文字,即

function sample($var1, $var2, $var3 = array(1, 2, 3, 4))
{
}

如果您想要这种行为,可以使用闭包:

$arr = array(1, 2, 3, 4);

$sample = function ($var1, $var2, array $var3 = null) use ($arr) {
    if (is_null($var3)) {
        $var3 = $arr;
    }

    // your code
}

$sample('a', 'b');

您也可以用课程表达:

class Foo
{
    private static $arr = array(1, 2, 3, 4);

    public static function bar($var1, $var2, array $var3 = null)
    {
        if (is_null($var3)) {
            $var3 = self::$arr;
        }

        // your code here
    }
}

Foo::bar('a', 'b');

答案 1 :(得分:7)

你不能将$arr传递给函数定义,你必须这样做:

function sample($var1, $var2, $var3 = array('test')){
    echo $var1.$var2;
    echo print_r($var3);
}

sample('a','b'); // output: abArray ( [0] => test ) 1

或者,如果你想变得很脏(我不推荐它......):

$arr = array('test');

function sample($var1, $var2, $var3 = null){
    if($var3 == null){
      global $arr;
      $var3 = $arr;
    }
    echo $var1.$var2;
    echo print_r($var3);
}

sample('a','b');

答案 2 :(得分:0)

(这可能不是一个完整的答案,但是它涵盖了一些有用的情况。)如果要使用数组作为函数(或方法)的参数来获取一个或多个选项,请设置一组默认选项可能没有帮助。相反,您可以使用array_replace()

例如,让我们考虑一个示例$options参数,该参数获取一个包含两个键counttitle的数组。为该参数设置默认值会导致在使用带有任何自定义$option值的函数时覆盖该参数。在示例中,如果我们将$options设置为只有一个count键,那么title键将被删除。正确的解决方案之一是:

function someCoolFunc($options = []) {
    $options = array_replace([
        "count" => 144,
        "title" => "test"
    ], $options);

    // Remained code... 
}

在上面的示例中,即使用户提供了一个空数组,也将确保存在counttitle索引(请记住,{{1 }}功能很重要)。

答案 3 :(得分:0)

我尝试了上面的最后一个示例。这是我的可比测试:

function someFunc($options = [])
    {
        $options = array_replace([
            "<br>", "<b>", "<i>", "<u>", "<hr>", "<span>"
        ], $options);
        print_r($options);
    }

结果如下:

>>> somefunc()
Array
(
    [0] => <br>
    [1] => <b>
    [2] => <i>
    [3] => <u>
    [4] => <hr>
    [5] => <span>
)
=> null

但是看看当您尝试添加标签时会发生什么。注意原始值会发生什么。元素 [0] 已更改。该数组未添加到:

>>> someFunc(["<div>"])
Array
(
    [0] => <div>
    [1] => <b>
    [2] => <i>
    [3] => <u>
    [4] => <hr>
    [5] => <span>
)
=> null

这将允许您将元素添加到默认选项:

function someFunc($options = array())
    {
       array_push($options, "<br>", "<b>", "<i>", "<u>", "<hr>", "<span>");
       return $options;
    }

结果如下:

>>> someFunc()
=> [
     "<br>",
     "<b>",
     "<i>",
     "<u>",
     "<hr>",
     "<span>",
   ]

---
 someFunc(["<div>","<table>"]);
=> [
     "<div>",
     "<table>",
     "<br>",
     "<b>",
     "<i>",
     "<u>",
     "<hr>",
     "<span>",
   ]

通过这种方式,默认值被添加到。