Любой способ указать необязательные значения параметров в PHP? - PullRequest
20 голосов
/ 27 марта 2009

Допустим, у меня есть PHP-функция foo:

function foo($firstName = 'john', $lastName = 'doe') {
    echo $firstName . " " . $lastName;
}
// foo(); --> john doe

Можно ли указать только второй необязательный параметр?

Пример:

foo($lastName='smith'); // output: john smith

Ответы [ 12 ]

0 голосов
/ 27 марта 2009

К сожалению, то, что вы пытаетесь сделать, не имеет «синтаксического сахара». Они все разные формы 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');

0 голосов
/ 27 марта 2009

Нет, но вы можете использовать массив:

function foo ($nameArray) {
    // Work out which values are missing?
    echo $nameArray['firstName'] . " " . $nameArray['lastName'];
}

foo(array('lastName'=>'smith'));
...