К сожалению, то, что вы пытаетесь сделать, не имеет «синтаксического сахара». Они все разные формы WTF.
Если вам нужна функция, которая принимает неопределенное количество произвольных параметров,
function foo () {
$args = func_get_args();
# $args = arguments in order
}
Подойдет. Старайтесь не использовать его слишком много, потому что для Php это немного магически.
Затем вы можете по умолчанию применять значения по умолчанию и делать странные вещи, основываясь на количестве параметров.
function foo(){
$args = func_get_args();
if( count($args) < 1 ){
return "John Smith";
}
if( count($args) < 2 ) {
return "John " .$args[0];
}
return $args[0] . " " . $args[1];
}
Кроме того, вы можете дополнительно эмулировать параметры стиля Perl,
function params_collect( $arglist ){
$config = array();
for( $i = 0; $i < count($arglist); $i+=2 ){
$config[$i] = $config[$i+1];
}
return $config;
}
function param_default( $config, $param, $default ){
if( !isset( $config[$param] ) ){
$config[$param] = $default;
}
return $config;
}
function foo(){
$args = func_get_args();
$config = params_collect( $args );
$config = param_default( $config, 'firstname' , 'John' );
$config = param_default( $config, 'lastname' , 'Smith' );
return $config['firstname'] . ' ' . $config['lastname'];
}
foo( 'firstname' , 'john', 'lastname' , 'bob' );
foo( 'lastname' , 'bob', 'firstname', 'bob' );
foo( 'firstname' , 'smith');
foo( 'lastname', 'john' );
Конечно, было бы проще использовать аргумент массива здесь, но вам позволено иметь выбор (даже плохие способы) что-то делать.
примечательно, что в Perl это лучше, потому что вы можете сделать просто foo (firstname => 'john');