J'aime faire ce genre de chose en Perl: $foo = $bar || $baz
attribuer $baz
à $foo
si $bar
est vide ou non défini. Vous avez également $foo ||= $bletch
qui n'attribuer $bletch
à $foo
si $foo
n'est pas défini ou vide.
L'opérateur ternaire dans cette situation est fastidieux et ennuyeux. Il existe sûrement une méthode simple et élégante disponible en PHP?
Ou la seule réponse est-elle une fonction personnalisée qui utilise isset ()?
php
perl
operators
default-value
Tom Auger
la source
la source
//
et//=
et ils existent à partir de Perl v5.10.0. L'original||
et||=
teste la valeur logique, pas la définition.Réponses:
En PHP 7, nous avons enfin un moyen de faire cela avec élégance. Il est appelé l' opérateur de fusion Null . Vous pouvez l'utiliser comme ceci:
Cela équivaut à
la source
<=>
et assez précise pour démarrer!null
valeur. Par exemple, si$_GET['name']
est défini sur une chaîne vide, la première ligne renverrait une chaîne vide, mais nous pourrions renvoyer "john doe" en utilisant$_GET['name'] ? $_GET['name'] : 'john doe'
.PHP 5.3 a un
?:
opérateur de raccourci :Ce qui attribue
$bar
si ce n'est pas une valeur vide (je ne sais pas en quoi cela serait différent en PHP de Perl), sinon$baz
, et c'est la même chose en Perl et les anciennes versions de PHP:Mais PHP n'a pas d'opérateur d'assignation composé pour cela (c'est-à-dire pas d'équivalent de Perl
||=
).De plus, PHP fera du bruit s'il
$bar
n'est pas défini, sauf si vous désactivez les notifications. Il existe également une différence sémantique entreisset()
etempty()
. Le premier retourne false si la variable n'existe pas ou est définie surNULL
. Ce dernier retourne vrai s'il n'existe pas ou est réglé sur0
,''
,false
ouNULL
.la source
The first returns
au lieu deThe second
dans votre avant-dernière phrase.$var = isset($var) ? $var : 'default value';
Cela dit que dans la réponse ... il suffit de le signaler à tous ceux qui l'écrément. :-DMerci pour toutes les bonnes réponses!
Pour quiconque vient ici pour une alternative possible, voici quelques fonctions qui aident à réduire l'ennui de ce genre de choses.
Exemples:
Je suis sûr que ceux-ci peuvent être améliorés.
la source
Un idiome courant pour rester compatible avec les anciennes versions de PHP est:
Cela fonctionne pour les valeurs qui peuvent être évaluées dans un contexte booléen. L'avantage ici est qu'il vous donne également un e_notice de débogage si la variable n'est pas définie.
la source
$bool ? $bool : "default"
si$bool
n'est pas défini?isset($var) ? $var : DEFAULT
. Mais on dirait qu'il veut les éviter de toute façon.En PHP antérieur à 7. *, on peut utiliser?: Pour une variable indéfinie ayant des erreurs supprimées localement avec un
@
:la source
c'est un autre bon format pour le
isset
boîtierisset($foo) || $foo= $bar;
un autre moyen simple et vous donnera plus de contrôle car vous pouvez ajouter plus de conditions et assigner à une autre variable en même temps
$foo = (isset($oData['foo']))?$bar['foo']:'default value';
la source
Une solution possible: defaultFor ()
À moins d'avoir une solution d'usine (ce qui est en effet très ennuyeux), je recommanderais le petit assistant suivant. Il fait le travail dans la plupart des cas:
J'espère que c'est proche de ce que vous vouliez réaliser. Il ne vous donnera aucun avis si vous l'utilisez avec une variable inexistante, et c'est assez pratique. Cela a sûrement un inconvénient: la valeur par défaut est toujours calculée à l'avance, alors ne l'utilisez pas avec quelque chose de lourd comme deuxième paramètre, comme un file_get_contents ou quelque chose. Dans ces cas, il vaut mieux émettre.
la source
Je pense en général faire quelque chose comme ça:
est une mauvaise idée, sauf si
$bar
et$baz
sont tous les deux des booléens. S'ils ne sont pas:alors la question devient: qu'est-ce qui détermine si quelque chose est vrai ou faux? La plupart des gens s'attendraient probablement à ce que zéro soit faux et que tout le reste soit vrai. Mais avec certains langages (par exemple Ruby), seulement
false
etnil
sont faux, ce qui signifie les deux0
et1
serait vrai. En raison de cette ambiguïté entre les langues, je pense qu'il vaut mieux être explicite dans ces cas:ou:
la source