Я бы хотел, чтобы это решение было на 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'));
Результаты:
Собака встала на осла
Кот сел на ослика
Собака стояла на коврике
person
DJDave
schedule
19.08.2015