2009-02-23 6 views
7

J'ai ceci:Est-il possible d'ignorer les paramètres ayant des valeurs par défaut dans un appel de fonction php (5)?

function foo($a='apple', $b='brown', $c='Capulet') { 
    // do something 
} 

est quelque chose comme ceci possible:

foo('aardvark', <use the default, please>, 'Montague'); 
+1

Il existe une proposition pour implémenter cette fonctionnalité dans php5.5 [https://wiki.php.net/rfc/skipparams](https://wiki.php.net/rfc/skipparams) – Shahid

+0

Qu'en est-il de Syntactic? https://github.com/topclaudy/php-syntactic – cjdaniel

Répondre

1

Vous avez à peu près trouvé la réponse, mais l'approche académique/de haut niveau est function currying dont honnêtement je n'ai jamais trouvé beaucoup d'utilisation, mais il est utile de savoir qu'il existe.

+0

Je ne pense pas que la curry puisse faire quoi que ce soit à propos des valeurs d'arguments par défaut - ce sont des concepts qui s'excluent à peu près mutuellement. – jpalecek

5

Si c'est votre fonction au lieu d'un du noyau de PHP, vous pouvez faire:

function foo($arguments = []) { 
    $defaults = [ 
    'an_argument' => 'a value', 
    'another_argument' => 'another value', 
    'third_argument' => 'yet another value!', 
    ]; 

    $arguments = array_merge($defaults, $arguments); 

    // now, do stuff! 
} 

foo(['another_argument' => 'not the default value!']); 
12

Si c'est votre fonction, vous pouvez utiliser null comme joker et définir la valeur par défaut plus tard dans la fonction:

function foo($a=null, $b=null, $c=null) { 
    if (is_null($a)) { 
     $a = 'apple'; 
    } 
    if (is_null($b)) { 
     $b = 'brown'; 
    } 
    if (is_null($c)) { 
     $c = 'Capulet'; 
    } 
    echo "$a, $b, $c"; 
} 

Ensuite, vous pouvez les sauter à l'aide null:

foo('aardvark', null, 'Montague'); 
// output: "aarkvark, brown, Montague" 
0

Vous pouvez utiliser quelques bizarreries, en passant tous les arguments comme un tableau comme ceejayoz suggère, ou un code trop compliqué qui analyse func_get_args() et fusionne avec une liste de valeurs par défaut. Pour ne pas copier-coller, vous devrez utiliser des objets et des traits. Enfin, pour pouvoir passer toutes sortes de valeurs (sans exclure null ou false en en faisant un signal de substitution de param par défaut), vous devrez déclarer un type spécial fictif DefaultParam. Un autre inconvénient est que vous devez dupliquer les noms et les valeurs par défaut dans la déclaration de fonction, si vous voulez obtenir des conseils de type ou de l'aide dans n'importe quel IDE.

class DefaultParam {} 

trait multi_arg_functions 
{ 
    private static function multi_arg($defaults, $list, $preserve_index = false) 
    { 
    $arg_keys = array_slice(array_keys($defaults), 0, count($list)); 

    if ($preserve_index) { 
     $listed_arguments = array_slice($list, 0, count($arg_keys)); 
     $extras = array_slice($list, count($arg_keys), null, true); 
    } else { 
     $listed_arguments = array_splice($list, 0, count($arg_keys)); 
     $extras = &$list; 
    } 
    unset($list); 

    $arguments = array_combine($arg_keys, $listed_arguments); 
    $arguments = array_filter($arguments, function ($entry) { 
     return !($entry instanceof DefaultParam); //remove entries that mean default, a special class in this case 
    }); 
    $arguments = array_merge($defaults, $arguments); 

    return [$arguments, $extras]; 
    } 
} 

class b { 
    use multi_arg_functions; 

    static function func1($an_argument = 'a value', $another_argument = 'another value', $third_argument = 'yet another value') { //give defaults here to get hints in an IDE 
     list($args, $extras) = self::multi_arg(//note: duplicate names and defaults 
      [ 
      'an_argument' => 'a value', 
      'another_argument' => 'another value', 
      'third_argument' => 'yet another value!', 
      ], func_get_args()); 

     echo json_encode(['args' => $args, 'extras' => $extras])."\n"; 
    } 
} 

$default_param = new DefaultParam(); 

b::func1('value 1'); 
b::func1('value 2', $default_param, 'third argument'); 
b::func1('value 3', $default_param, 'third argument', 'fourth argument'); 

Remarque: en utilisant preserve_index = true, vous obtenez les arguments supplémentaires à partir de leur index d'origine.

Questions connexes