web-dev-qa-db-fra.com

Meilleure façon de donner une valeur par défaut à une variable (simuler Perl ||, || =)

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 ()?

108
Tom Auger

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.

195
BoltClock

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';
91
jpschroeder

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.

8
Tom Auger

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.

7
mario

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;
3
AndreyS Scherbakov

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';

0
Bassem Shahin