Использование массива в качестве параметра по умолчанию в функции PHP

Можно ли использовать массив в качестве параметра по умолчанию в функции 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

Ответы

Ответ 1

Нет, это невозможно, правильное выражение значения по умолчанию должно быть константным или массивным литералом, то есть

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

Ответ 2

Вы не можете передать $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');

Ответ 3

(Это может быть не полный ответ, но он охватывает некоторые полезные случаи.) Если вы хотите получить один или несколько параметров, используя массив в качестве аргумента в функции (или метод), установка набора параметров по умолчанию может не помочь, Вместо этого вы можете использовать array_replace().

Например, давайте рассмотрим пример аргумента $options который получает массив с двумя ключами, count и title. Установка значения по умолчанию для этого аргумента приводит к его переопределению при использовании функции с любым переданным значением пользовательской $option. В этом примере, если мы установим в $options только один ключ count ключ title будет удален. Одним из правильных решений является следующее:

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

    // Remained code... 
}

В приведенном выше примере вы будете уверены, что индексы count и title присутствуют, даже если пользователь предоставляет пустой массив (имейте в виду, что порядок аргументов в функции array_replace() важен).