Хотелось бы, чтобы это решение было на SO, когда я начал использовать PHP 2,5 года назад. Он прекрасно работает в примерах, которые я создал, и я не понимаю, почему он не должен быть полностью расширяемым. Он предлагает следующие преимущества по сравнению с предложенными ранее:
(i) весь доступ к параметрам внутри функции осуществляется по именованным переменным, как если бы параметры были полностью объявлены, а не требует доступа к массиву
(ii) очень быстро и легко адаптировать существующие функции
(iii) для любой функции требуется только одна строка дополнительного кода (в дополнение к неизбежной необходимости определения параметров по умолчанию, которые вы все равно выполняете в сигнатуре функции, но вместо этого вы определяете их в массиве ). Кредит на дополнительную линию полностью принадлежит Биллу Карвину. Эта строка идентична для каждой функции.
Метод
Определите вашу функцию с ее обязательными параметрами и необязательным массивом
Объявите необязательные параметры в качестве локальных переменных
Суть: заменить предварительно объявленное значение по умолчанию любых необязательных параметров, используя те, которые вы передали через массив.
extract(array_merge($arrDefaults, array_intersect_key($arrOptionalParams, $arrDefaults)));
Вызовите функцию, передав ее обязательные параметры и только те необязательные параметры, которые вам требуются
Например,
function test_params($a, $b, $arrOptionalParams = array()) {
$arrDefaults = array('c' => 'sat',
'd' => 'mat');
extract(array_merge($arrDefaults, array_intersect_key($arrOptionalParams, $arrDefaults)));
echo "$a $b $c on the $d";
}
и затем назовите это так
test_params('The', 'dog', array('c' => 'stood', 'd' => 'donkey'));
test_params('The', 'cat', array('d' => 'donkey'));
test_params('A', 'dog', array('c' => 'stood'));
Результаты:
собака стояла на осле
Кот сел на осла
На коврике стояла собака