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

Jas*_*lsa 17 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
Run Code Online (Sandbox Code Playgroud)

Ja͢*_*͢ck 23

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

function sample($var1, $var2, $var3 = array(1, 2, 3, 4))
{
}
Run Code Online (Sandbox Code Playgroud)

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

$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');
Run Code Online (Sandbox Code Playgroud)

你也可以用一个类来表达它:

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');
Run Code Online (Sandbox Code Playgroud)

  • @jasdeepkhalsa它有效,传递的值必须是数组或默认值"null". (2认同)

Pri*_*ner 7

您无法$arr进入函数定义,您必须这样做:

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

sample('a','b'); // output: abArray ( [0] => test ) 1
Run Code Online (Sandbox Code Playgroud)

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

$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');
Run Code Online (Sandbox Code Playgroud)


MAC*_*rha 5

(这可能不是一个完整的答案,但它涵盖了一些有用的案例。)

如果您想使用数组作为函数(或方法)中的参数来获取一个或多个选项,设置一组默认选项可能没有帮助。相反,您可以使用array_replace().

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

function someCoolFunc($options = []) {
    $options = array_replace([
        "count" => 144,
        "title" => "test"
    ], $options);
    
    // ... 
}
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,即使用户提供空数组,也将确保count和索引存在(请记住,函数中参数的顺序很重要)。titlearray_replace()

注意:在所解释的情况下,使用类(或接口)也是一种选择,但选择数组的一个原因可能是简单(甚至是性能)。