J'aime faire ce genre de chose en Perl: $foo = $bar || $baz
assigner $baz
à $foo
si $bar
est vide ou non défini. Vous avez aussi $foo ||= $bletch
qui n'affectera que $bletch
à $foo
si $foo
n'est pas défini ou vide.
L'opérateur ternaire dans cette situation est fastidieux et fastidieux. 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 5.3 a un opérateur abrégé _?:
_:
_$foo = $bar ?: $baz;
_
Qui affecte _$bar
_ si ce n'est pas une valeur vide (je ne sais pas en quoi cela serait différent dans PHP de Perl), sinon _$baz
_, et est identique comme ceci dans Perl et les anciennes versions de PHP:
_$foo = $bar ? $bar : $baz;
_
Mais PHP n’a pas d’opérateur composé pour cela (c’est-à-dire qu’il n’a pas d’équivalent de _||=
_ de Perl).
De plus, PHP fera du bruit si _$bar
_ n'est pas défini, sauf si vous désactivez les notifications. Il existe également une différence sémantique entre isset()
et empty()
. Le premier retourne false si la variable n'existe pas ou est défini sur NULL
. Le dernier renvoie true s'il n'existe pas ou s'il est défini sur _0
_, _''
_, false
ou NULL
.
Dans PHP 7, nous avons enfin un moyen de le faire avec élégance. Il s’appelle l’opérateur de coalescence nulle . Vous pouvez l’utiliser comme ceci:
$name = $_GET['name'] ?? 'john doe';
Ceci est équivalent à
$name = isset($_GET['name']) ? $_GET['name']:'john doe';
Merci pour toutes les bonnes réponses!
Pour tous ceux qui viennent ici pour une alternative possible, voici quelques fonctions qui aident à éliminer l’ennui de ce genre de choses.
function set_if_defined(&$var, $test){
if (isset($test)){
$var = $test;
return true;
} else {
return false;
}
}
function set_unless_defined(&$var, $default_var){
if (! isset($var)){
$var = $default_var;
return true;
} else {
return false;
}
}
function select_defined(){
$l = func_num_args();
$a = func_get_args();
for ($i=0; $i<$l; $i++){
if ($a[$i]) return $a[$i];
}
}
Exemples:
// $foo ||= $bar;
set_unless_defined($foo, $bar);
//$foo = $baz || $bletch
$foo = select_defined($baz, $bletch);
Je suis sûr que ceux-ci peuvent être améliorés.
Un idiome courant pour rester compatible avec les anciennes PHP versions est:
$var = $bool or $var = "default";
// If I use it, then only with excessive spaces for clarity.
Cela fonctionne pour les valeurs qui peuvent être évaluées dans un contexte booléen. L'avantage ici est que cela vous donne également dit debug e_notice si la variable est indéfinie.
Dans PHP antérieure à 7. *, on peut utiliser?: Pour une variable non définie ayant des erreurs supprimées localement avec un @
:
$foo = @$bar ?: $baz;
c'est un autre bon format pour le cas isset
isset($foo) || $foo= $bar;
un autre moyen simple et vous donnera plus de contrôle car vous pouvez ajouter plus de conditions et affecter une autre variable en même temps
$foo = (isset($oData['foo']))?$bar['foo']:'default value';