Je ne comprends pas les valeurs par défaut des fonctions PHP. Disons que j'ai une fonction comme celle-ci:
function foo($blah, $x = "some value", $y = "some other value") {
// code here!
}
Que faire si je veux utiliser l'argument par défaut pour $ x et définir un argument différent pour $ y?
J'ai expérimenté différentes manières et je suis de plus en plus confus. Par exemple, j'ai essayé ces deux:
foo("blah", null, "test");
foo("blah", "", "test");
Mais les deux n'aboutissent pas à un argument par défaut approprié pour $ x. J'ai également essayé de le définir par nom de variable.
foo("blah", $x, $y = "test");
Je m'attendais vraiment à ce que quelque chose comme ça fonctionne. Mais cela ne fonctionne pas du tout comme je m'y attendais. Il semble que peu importe ce que je fais, je vais quand même devoir taper les arguments par défaut, chaque fois que j'invoque la fonction. Et je dois manquer quelque chose d'évident.
foo("blah", , "test");
?Réponses:
Je proposerais de changer la déclaration de fonction comme suit afin que vous puissiez faire ce que vous voulez:
De cette façon, vous pouvez passer un appel comme
foo('blah', null, 'non-default y value');
et le faire fonctionner comme vous le souhaitez, où le deuxième paramètre$x
obtient toujours sa valeur par défaut.Avec cette méthode, passer une valeur nulle signifie que vous voulez la valeur par défaut pour un paramètre lorsque vous souhaitez remplacer la valeur par défaut pour un paramètre qui vient après.
Comme indiqué dans d'autres réponses,
Si j'ai une méthode qui peut accepter un nombre variable de paramètres et des paramètres de types différents, je déclare souvent la fonction similaire à la réponse donnée par Ryan P.
Voici un autre exemple (cela ne répond pas à votre question, mais il est espérons-le informatif:
la source
null
valeur réelle au paramètre, car à chaque fois elle attribuerait la valeur par défaut. Même dans le cas où vous auriez une autre valeur spéciale pour le moment où vous voulez réellement un null (par exemple, lorsque $ x == "use_null" make $ x = null), vous ne pourrez pas attribuer une telle valeur spéciale comme valeur littérale du paramètre (dans ce cas, la chaîne "use_null"). Veillez donc simplement à utiliser une "clé" unique, que vous ne souhaitez jamais utiliser lorsque vous souhaitez utiliser la valeur par défaut (et que vous vouleznull
être une option valide)Les arguments facultatifs ne fonctionnent qu'à la fin d'un appel de fonction. Il n'y a aucun moyen de spécifier une valeur pour $ y dans votre fonction sans spécifier également $ x. Certains langages le prennent en charge via des paramètres nommés (VB / C # par exemple), mais pas PHP.
Vous pouvez émuler cela si vous utilisez un tableau associatif pour les paramètres au lieu des arguments - c.-à-d.
Appelez ensuite la fonction comme ceci:
la source
isset($args['x'])
, car elle remplacerait actuellement une chaîne vide, un tableau vide oufalse
la valeur par défaut.$x = !array_key_exists('x',$args) ? 'default x value' : $args['x'];
C'est effectivement possible:
Que vous vouliez le faire est une autre histoire :)
METTRE À JOUR:
Les raisons d'éviter cette solution sont:
Mais cela peut en fait être utile dans les situations où:
vous ne voulez pas / ne pouvez pas changer la fonction d'origine.
vous pouvez changer la fonction mais:
null
(ou équivalent) n'est pas une option (voir le commentaire de DiegoDD )func_num_args()
À propos des performances, un test très simple montre que l'utilisation de l'API Reflection pour obtenir les paramètres par défaut rend l'appel de fonction 25 fois plus lent , alors que cela prend toujours moins d'une microseconde . Vous devriez savoir si vous pouvez vivre avec ça.
Bien sûr, si vous voulez l'utiliser dans une boucle, vous devriez obtenir la valeur par défaut au préalable.
la source
la source
$defaults = [ 'x' => 'some value', 'y' => 'some other value'];
La seule façon que je connaisse de le faire est d'omettre le paramètre. La seule façon d'omettre le paramètre est de réorganiser la liste des paramètres de sorte que celui que vous souhaitez omettre soit après les paramètres que vous DEVEZ définir. Par exemple:
Ensuite, vous pouvez appeler foo comme:
Cela se traduira par:
la source
J'ai récemment eu ce problème et j'ai trouvé cette question et ces réponses. Bien que les questions ci-dessus fonctionnent, le problème est qu'elles ne montrent pas les valeurs par défaut aux IDE qui les prennent en charge (comme PHPStorm).
si vous utilisez,
null
vous ne saurez pas quelle serait la valeur si vous le laissez vide.La solution que je préfère est de mettre également la valeur par défaut dans la définition de la fonction:
La seule différence est que je dois m'assurer qu'ils sont identiques - mais je pense que c'est un petit prix à payer pour la clarté supplémentaire.
la source
Vous ne pouvez pas faire cela directement, mais un peu de bidouillage de code permet d'émuler.
la source
null
dans ce cas est conceptuellement plus soignée quefalse
.false
est un choix plus risqué quenull
, car php est un langage non strict.!$x
sera vrai pour plusieurs entrées différentes, ce qui peut surprendre le programmeur:0
,''
. Alors qu'avecnull
, vous pouvez utiliser!isset
comme test plus strict.la source
Mes 2 cents avec opérateur de fusion nul
??
(depuis PHP 7)Vous pouvez consulter plus d'exemples sur mon repl.it
la source
C'est le cas, lorsque l'objet est meilleur - parce que vous pouvez configurer votre objet pour qu'il contienne x et y, configurer les valeurs par défaut, etc.
L'approche avec tableau est proche de créer un objet (en fait, l'objet est un tas de paramètres et de fonctions qui fonctionneront sur l'objet, et le tableau de prise de fonction fonctionnera sur certains paramètres)
Cerainly vous pouvez toujours faire quelques astuces pour définir null ou quelque chose comme ça par défaut
la source
Vous pouvez également vérifier si vous avez une chaîne vide comme argument afin de pouvoir appeler comme:
foo('blah', "", 'non-default y value', null);
En dessous de la fonction:
Peu importe que vous remplissiez
null
ou""
, vous obtiendrez toujours le même résultat.la source
Passez un tableau à la fonction, au lieu de paramètres individuels et utilisez l'opérateur de fusion nul (PHP 7+).
Ci-dessous, je passe un tableau avec 2 éléments. À l'intérieur de la fonction, je vérifie si la valeur de l'élément1 est définie, si elle n'est pas attribuée au coffre par défaut.
la source
$args['item1'] = $args['item1']??'default value';
en PHP 7+. si $ args ['item1'] est nul alors ladefault value
chaîne sera assignée à $ args ['item1']