OK, j'ai totalement oublié comment sauter les arguments en PHP.
Disons que j'ai:
function getData($name, $limit = '50', $page = '1') {
...
}
Comment appeler cette fonction pour que le paramètre du milieu prenne la valeur par défaut (c'est-à-dire «50»)?
getData('some name', '', '23');
Ce qui précède serait-il correct? Je n'arrive pas à faire fonctionner ça.
php
function
parameters
default-value
optional-parameters
Chuck Le Butt
la source
la source
ReflectionFunction
. J'ai posté cette réponse dans une question similaire.Réponses:
Votre message est correct.
Malheureusement, si vous devez utiliser un paramètre facultatif à la toute fin de la liste de paramètres, vous devez tout spécifier jusqu'à ce dernier paramètre. Généralement, si vous voulez mélanger et assortir, vous leur donnez les valeurs par défaut de
''
ounull
, et ne les utilisez pas dans la fonction si elles sont cette valeur par défaut.la source
$limit = is_numeric($limit) ? $limit : '50';
au début de getData fonctionIl n'y a aucun moyen de "sauter" un argument autre que de spécifier une valeur par défaut comme
false
ounull
.Comme PHP manque de sucre syntaxique à ce sujet, vous verrez souvent quelque chose comme ceci:
Ce qui, comme dit éloquemment dans les commentaires, utilise des tableaux pour émuler des arguments nommés.
Cela donne une flexibilité ultime mais peut ne pas être nécessaire dans certains cas. À tout le moins, vous pouvez déplacer tout ce que vous pensez ne pas être attendu la plupart du temps à la fin de la liste des arguments.
la source
Non, il n'est pas possible de sauter des arguments de cette façon. Vous ne pouvez omettre de transmettre des arguments que s'ils se trouvent à la fin de la liste de paramètres.
Il y avait une proposition officielle à ce sujet: https://wiki.php.net/rfc/skipparams , qui a été refusée. La page de proposition renvoie à d'autres questions SO sur ce sujet.
la source
Rien n'a changé en ce qui concerne la possibilité de sauter des arguments facultatifs, mais pour une syntaxe correcte et pour pouvoir spécifier NULL pour les arguments que je veux ignorer, voici comment je le ferais:
Cela peut être appelé ainsi:
getData('some name',NULL,'23');
et quiconque appellera la fonction à l'avenir n'a pas besoin de se souvenir des valeurs par défaut à chaque fois ou de la constante déclarée pour eux.la source
La réponse simple est non . Mais pourquoi sauter lors de la réorganisation des arguments permet d'atteindre cet objectif?
Le vôtre est une " utilisation incorrecte des arguments de fonction par défaut " et ne fonctionnera pas comme vous le souhaitez.
Une note latérale de la documentation PHP:
Considérer ce qui suit:
La sortie sera:
L'utilisation correcte des arguments de fonction par défaut devrait être comme ceci:
La sortie sera:
Mettre la valeur par défaut à votre droite après les non-valeurs par défaut garantit qu'il sera toujours réexécuté la valeur par défaut pour cette variable si elle n'est pas définie / donnée Voici un lien pour référence et d'où viennent ces exemples.
Edit: le définir
null
comme d'autres le suggèrent peut fonctionner et est une autre alternative, mais peut ne pas convenir à ce que vous voulez. Il définira toujours la valeur par défaut sur null s'il n'est pas défini.la source
Pour tout paramètre ignoré (vous devez), utilisez le paramètre par défaut, pour être du bon côté.
(Le règlement de null où le paramètre par défaut est `` ou similaire ou vice versa vous posera des problèmes ...)
la source
Comme mentionné ci-dessus, vous ne pourrez pas ignorer les paramètres. J'ai écrit cette réponse pour fournir un addendum, qui était trop volumineux pour être placé dans un commentaire.
@Frank Nocke propose d'appeler la fonction avec ses paramètres par défaut, donc par exemple avoir
Tu devrais utiliser
ce qui revient fonctionnellement à omettre les deux premiers paramètres (
$b
et$c
).On ne sait pas lesquels sont les valeurs par défaut (est
0
tapé pour fournir la valeur par défaut, ou est-ce important?).Il existe également un risque que le problème des valeurs par défaut soit lié à une fonction externe (ou intégrée), lorsque les valeurs par défaut pourraient être modifiées par l'auteur de la fonction (ou de la méthode). Donc, si vous ne changez pas votre appel dans le programme, vous pourriez involontairement changer son comportement.
Une solution de contournement pourrait être de définir des constantes globales, comme
DEFAULT_A_B
ce serait «valeur par défaut du paramètre B de la fonction A» et «omettre» les paramètres de cette façon:Pour les classes, il est plus facile et plus élégant de définir des constantes de classe, car elles font partie de la portée globale, par exemple.
Notez que cette constante par défaut est définie exactement une fois dans tout le code (il n'y a pas de valeur même dans la déclaration de méthode), donc en cas de changements inattendus, vous fournirez toujours la fonction / méthode avec la valeur par défaut correcte.
La clarté de cette solution est bien sûr meilleure que de fournir des valeurs brutes par défaut (comme
NULL
,0
etc.) qui ne disent rien au lecteur.(Je suis d'accord qu'appeler comme
$var = a(,,'ddd');
serait la meilleure option)la source
Vous ne pouvez pas ignorer les arguments, mais vous pouvez utiliser des paramètres de tableau et vous ne devez définir qu'un seul paramètre, qui est un tableau de paramètres.
Et vous pouvez ajouter autant de paramètres dont vous avez besoin, vous n'avez pas besoin de les définir. Lorsque vous appelez la fonction, vous mettez vos paramètres comme ceci:
la source
Eh bien, comme tout le monde l'a déjà dit, ce que vous voulez ne sera pas possible en PHP sans ajouter de lignes de code dans la fonction.
Mais vous pouvez placer ce morceau de code en haut d'une fonction pour obtenir vos fonctionnalités:
Donc, fondamentalement,
debug_backtrace()
j'obtiens le nom de la fonction dans laquelle ce code est placé, pour ensuite créer un nouveauReflectionFunction
objet et une boucle à travers tous les arguments de la fonction.Dans la boucle, je vérifie simplement si l'argument de la fonction est
empty()
ET que l'argument est "optionnel" (signifie qu'il a une valeur par défaut). Si oui, j'attribue simplement la valeur par défaut à l'argument.Demo
la source
Définissez la limite sur null
et appel à cette fonction
si vous souhaitez définir la limite, vous pouvez passer en argument
la source
Comme indiqué précédemment , rien n'a changé. Attention, cependant, trop de paramètres (en particulier ceux optionnels) sont un indicateur fort de l'odeur du code.
Peut-être que votre fonction en fait trop:
Certains paramètres peuvent être regroupés de manière logique:
En dernier recours, vous pouvez toujours introduire un objet paramètre ad-hoc :
(qui est juste une version glorifiée de la technique de tableau de paramètres moins formelle )
Parfois, la raison même pour laquelle un paramètre est optionnel est fausse. Dans cet exemple, est-ce
$page
vraiment censé être facultatif? L'enregistrement de quelques personnages fait-il vraiment une différence?la source
Cet extrait:
La réponse est:
la source
Voici ce que je ferais:
J'espère que cela aidera quelqu'un
la source
C'est une sorte de vieille question avec un certain nombre de réponses techniquement compétentes, mais elle réclame l'un des modèles de conception modernes de PHP: la programmation orientée objet. Au lieu d'injecter une collection de types de données scalaires primitifs, envisagez d'utiliser un "objet injecté" qui contient toutes les données nécessaires à la fonction. http://php.net/manual/en/language.types.intro.php
L'objet injecté peut avoir des routines de validation de propriété, etc. avec des données potentiellement incomplètes.
Nous pouvons saisir l'objet injecté pour détecter les erreurs avant le déploiement. Certaines des idées sont résumées dans cet article d'il y a quelques années.
https://www.experts-exchange.com/articles/18409/Using-Named-Parameters-in-PHP-Function-Calls.html
la source
J'ai dû créer une usine avec des paramètres optionnels, ma solution de contournement était d'utiliser l'opérateur de fusion nul:
Usage:
Ce n'est pas la chose la plus jolie, mais pourrait être un bon modèle à utiliser dans les usines pour les tests.
la source
Essaye ça.
la source
Vous ne pouvez pas ignorer le paramètre du milieu dans votre appel de fonction. Mais, vous pouvez contourner ceci:
Fonction:
la source
Comme l'a souligné @IbrahimLawal. Il est préférable de les définir simplement sur des
null
valeurs. Vérifiez simplement si la valeur passée est cellenull
dans laquelle vous utilisez vos valeurs par défaut définies.J'espère que cela t'aides.
la source
ne les transmettez pas et la valeur par défaut sera acceptée
la source