5

Je sais qu'il est possible d'utiliser des arguments optionnels comme suit:PHP Paramètres facultatifs - Spécifiez la valeur du paramètre par son nom?

function doSomething($do, $something = "something") { 

} 

doSomething("do"); 
doSomething("do", "nothing"); 

Mais supposons que vous avez la situation suivante:

function doSomething($do, $something = "something", $or = "or", $nothing = "nothing") { 

} 

doSomething("do", $or=>"and", $nothing=>"something"); 

Ainsi, dans la ligne ci-dessus ce serait par défaut $something à « quelque chose », même si je mets des valeurs pour tout le reste. Je sais que c'est possible dans .net - je l'utilise tout le temps. Mais je dois le faire en PHP si possible.

Quelqu'un peut-il me dire si c'est possible? Je modifie le programme d'affiliation Omnistar que j'ai intégré dans Interspire Shopping Cart - donc je veux garder une fonction de travail normale pour tous les endroits où je ne change pas l'appel à la fonction, mais dans un endroit (que je suis en train de prolonger) vouloir spécifier des paramètres supplémentaires. Je ne veux pas créer une autre fonction sauf si je dois absolument.

+1

+1 à @sanmai; Notez également que Perl, Python et Ruby prennent tous en charge les paramètres nommés de la manière que vous décrivez. Si cette fonctionnalité est suffisamment importante, vous devriez envisager d'utiliser l'une de ces langues. –

Répondre

11

Non, en PHP qui n'est pas possible d'écrire. Utilisez des arguments de tableau:

function doSomething($arguments = array()) { 
    // set defaults 
    $arguments = array_merge(array(
     "argument" => "default value", 
    ), $arguments); 

    var_dump($arguments); 
} 

Exemple d'utilisation:

doSomething(); // with all defaults, or: 
doSomething(array("argument" => "other value")); 

Lors de la modification d'une méthode existante:

//function doSomething($bar, $baz) { 
function doSomething($bar, $baz, $arguments = array()) { 
    // $bar and $baz remain in place, old code works 
} 
+0

Cela semble être le genre de chose que je devrais utiliser. Va le cocher comme la bonne réponse quand je suis capable de le faire. Merci. – ClarkeyBoy

+0

Juste pensé à une chose - actuellement il y a 4 arguments, dont deux sont facultatifs. Je veux ajouter un autre 4. En mettant en application cette méthode, je le réduirais à un argument (un tableau). Cela casserait tous les appels à la fonction en dehors du fichier que je veux modifier cela.Il a été depuis des années que j'ai fait du PHP, mais je suppose que je pourrais juste créer une autre fonction appelée la même chose mais avec un nombre différent d'arguments. Pas idéal - mais cela devrait fonctionner. – ClarkeyBoy

+0

@ClarkeyBoy Vous pouvez avoir autant d'arguments que vous le souhaitez. Voir l'exemple supplémentaire. – sanmai

3
+0

Merci pour la contribution - mais je pense que la réponse de sanmai convient un peu mieux à ma situation. Avec cette méthode je ne serais pas capable de récupérer un argument par son nom - donc je frapperais le même mur de briques (je pense). – ClarkeyBoy

2

arguments nommés ne sont pas actuellement disponibles en PHP (5.3). Pour contourner cela, vous voyez généralement une fonction recevant un argument array(), puis en utilisant extract() pour utiliser les arguments fournis dans les variables locales ou array_merge() pour les définir par défaut.

Votre exemple original ressemblerait à quelque chose comme:

$args = array('do' => 'do', 'or' => 'not', 'nothing' => 'something'); 
doSomething($args); 
0

PHP n'a pas de paramètres nommés. Vous devrez décider d'une solution de contournement.

Le plus souvent, un paramètre de tableau est utilisé. Mais une autre méthode intelligente utilise des paramètres d'URL, si vous avez besoin des valeurs littérales:

function with_options($any) { 
     parse_str($any); // or extract() for array params 
} 

with_options("param=123&and=and&or=or"); 

offrent en outre les paramètres par défaut comme il convient à votre cas d'utilisation particulière.

+0

Quelle surcharge! Pensez à passer un objet de cette façon. – sanmai

+2

@sanmai: Dépend toujours de l'utilisation. Les micro-optimisations sont pour les imbéciles. Et les frais généraux imaginaires sont préférables à vous gêner avec une API maladroite. – mario

Questions connexes