Ojalá esta solución hubiera estado en SO cuando comencé a usar PHP hace 2.5 años. Funciona muy bien en los ejemplos que he creado, y no veo por qué no debe ser completamente extensible. Ofrece las siguientes ventajas con respecto a los propuestos anteriormente:
(i) todos los accesos a los parámetros dentro de la función es mediante variables con nombre, como si los parámetros fueron totalmente declarados, en lugar de requerir acceso a matriz
(ii) es muy rápido y fácil de adaptar las funciones existentes
(iii) solo se requiere una línea de código adicional para cualquier función (además de la necesidad ineludible de definir sus parámetros predeterminados, que estaría haciendo en la función de firma de todos modos, pero en su lugar los defines en una matriz). El crédito por la línea adicional se debe totalmente a Bill Karwin. Esta línea es idéntica para cada función.
Método
definir su función con sus parámetros obligatorios, y un conjunto opcional
declara su parámetros opcionales como variables locales
El quid: reemplazar el valor por defecto pre-declarado de los parámetros opcionales usando aquellos que ha pasado a través de la matriz.
extract(array_merge($arrDefaults, array_intersect_key($arrOptionalParams, $arrDefaults)));
Llame a la función, pasando sus parámetros obligatorios, y sólo los parámetros opcionales que se requieren
Por ejemplo,
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";
}
y luego llamarlo como esto
test_params('The', 'dog', array('c' => 'stood', 'd' => 'donkey'));
test_params('The', 'cat', array('d' => 'donkey'));
test_params('A', 'dog', array('c' => 'stood'));
Resultados:
El perro se puso sobre el asno
El gato se sentó en el burro
Un perro se puso en el tapete
Aunque no hay soporte implícito, existen mejores soluciones que las sugeridas por la respuesta aceptada. Vea la solución de Walf a continuación. Hay más detalles si lo necesitas en mi solución (¡que juro que llegué de manera independiente!) – DJDave