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

Есть функция:

function button($text, $value, $col = 6, $row = 1, $color = "#ffffff", $size = 'large', $type = 'reply'){
    return [
            'Columns' => $col,
            'Rows' => $row,
            'Text' => '<font color="'.$color.'"><b>'.$text.'</b></font>',
            'BgColor' => "#30cecb",
            'TextVAlign' => 'middle',
            'TextHAlign' => 'middle',
            'TextSize' => $size,
            'ActionType' => $type,
            'ActionBody' => $value,
        ];
}

Каким образом я могу задать параметр "color" не задавая параметров col и row? При вызове:

button('button', 'but|run', NULL, NULL, "#ffffff")

Не будет использоваться аргумент по умолчанию, а просто ему передастся NULL. Каким образом можно задать какой-либо параметр после тех что задаются по умолчанию, но в тех что перед ним не менять значение?


Ответы (1 шт):

Автор решения: u_mulder

До php версии 8 твоя проблема не решаема никак.

В восьмерке появились именованные аргументы, позволяющие указывать только нужные аргументы и даже в любом порядке, пример работы здесь, внимание на вывод по версиям

function button($text, $value, $col = 6, $row = 1, $color = "#ffffff", $size = 'large', $type = 'reply'){
    return [
            'Columns' => $col,
            'Rows' => $row,
            'Text' => '<font color="'.$color.'"><b>'.$text.'</b></font>',
            'BgColor' => "#30cecb",
            'TextVAlign' => 'middle',
            'TextHAlign' => 'middle',
            'TextSize' => $size,
            'ActionType' => $type,
            'ActionBody' => $value,
        ];
}

print_r(button(text:'Text here', color:'#333333', value:'value here'));

Но если функцию можно отредактировать, то можно передавать в нее аргумент в виде массива, например:

function button(array $buttonParameters) {
    return [
        'Columns' => $buttonParameters['col'] ?: 1,
        'Rows' => $buttonParameters['row'] ?: 6,
         // ...
        'ActionBody' => $buttonParameters['value'] ?: 'Default value',
    ];
}

Однако это ухудшает понимание кода, так как кроме разработчика (а через месяц и он забудет) никто не знает, какие ключи массива надо передавать.

→ Ссылка