163 votes

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

J'adore faire ce genre de choses en Perl : $foo = $bar || $baz d'attribuer $baz à $foo si $bar est vide ou indéfinie. Vous avez également $foo ||= $bletch qui n'attribuera que $bletch à $foo si $foo n'est pas défini ou est vide.

L'opérateur ternaire dans cette situation est fastidieux et fatigant. Il y a sûrement une méthode simple et élégante disponible en PHP ?

Ou la seule réponse est une fonction personnalisée qui utilise isset() ?

1 votes

1 votes

En attendant, les opérateurs Perl ayant la fonctionnalité souhaitée sont les suivants // et //= et ils existent depuis Perl v5.10.0. L'original || et ||= testent la valeur logique, et non la définition.

1 votes

@Palec, pourquoi une question vieille de 4 ans avec 29 upvotes serait-elle identifiée comme un doublon d'une question vieille d'un an avec 6 upvotes (qui a elle-même été marquée comme un doublon d'une autre question ?) Je pense qu'il y a une grande valeur à garder cette question, car le titre est plus générique (ne fait pas référence à la réponse, par exemple : isset()).

237voto

BoltClock Points 249668

PHP 5.3 dispose d'un raccourci ?: opérateur :

$foo = $bar ?: $baz;

Qui attribue $bar s'il ne s'agit pas d'une valeur vide (je ne sais pas en quoi cela serait différent en PHP et en Perl), autrement $baz et c'est la même chose en Perl et dans les anciennes versions de PHP :

$foo = $bar ? $bar : $baz;

Mais PHP n'a pas d'opérateur d'affectation composé pour cela (c'est-à-dire qu'il n'y a pas d'équivalent de l'opérateur d'affectation de Perl). ||= ).

De plus, PHP fera du bruit si $bar n'est pas défini, sauf si vous désactivez les avis. Il existe également une différence sémantique entre isset() et empty() . La première renvoie false si la variable n'existe pas, ou si elle a la valeur suivante NULL . Ce dernier renvoie un message vrai s'il n'existe pas ou s'il est défini comme suit 0 , '' , false ou NULL .

2 votes

+1 Pour m'avoir fait découvrir une autre grande fonctionnalité de la 5.3 que je rate sur mes serveurs RHEL5/PHP5.1.2.

0 votes

Je suppose que vous voulez dire The first returns au lieu de The second dans votre avant-dernière phrase.

23 votes

Notez que si votre variable est indéfinie, PHP lancera des notifications à ce sujet. Ceci, malheureusement, ne remplace pas $var = isset($var) ? $var : 'default value'; C'est ce qui est dit dans la réponse... je le signale juste à ceux qui ne l'ont pas lu. :-D

176voto

jpschroeder Points 2615

En PHP 7, nous avons enfin un moyen de le faire de manière élégante. Cela s'appelle la Opérateur de coalescence nul . Vous pouvez l'utiliser comme ceci :

$name = $_GET['name'] ?? 'john doe';

Ceci est équivalent à

$name = isset($_GET['name']) ? $_GET['name']:'john doe';

15 votes

Je dirais que le opérateur de vaisseau spatial a aussi du mérite.

4 votes

Je pensais que Mariano se moquait de nous, mais non, c'est un fait. <=> et assez précis en plus !

2 votes

Notez que l'opérateur de coalescence des nuls se comporte différemment de l'opérateur conditionnel, puisqu'il est spécifique à une null valeur. Par exemple, si $_GET['name'] est définie comme une chaîne vide, la première ligne renverrait une chaîne vide, mais nous pourrions renvoyer "John Doe" en utilisant la commande $_GET['name'] ? $_GET['name'] : 'john doe' .

10voto

En PHP antérieur à 7.*, on peut utiliser ? : pour une variable indéfinie dont les erreurs sont supprimées localement avec une balise @ :

$foo = @$bar ?: $baz;

8voto

Tom Auger Points 4246

Merci pour toutes les bonnes réponses !

Pour tous ceux qui cherchent une alternative possible, voici quelques fonctions qui permettent de rendre ce genre de choses moins ennuyeuses.

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 l'on peut les améliorer.

7voto

mario Points 76989

Un idiome commun pour rester compatible avec les anciennes versions de PHP 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 de cette méthode est qu'elle vous donne également un avis de débogage si la variable est indéfinie.

0 votes

Est un avis non émis avec $bool ? $bool : "default" si $bool n'est pas défini ?

0 votes

Bien sûr, c'est la même chose. Je suppose que l'OP se réfère à isset($var) ? $var : DEFAULT . Mais on dirait qu'il veut les éviter de toute façon.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X