50 votes

PHP : Vérifier si une variable existe mais aussi si elle a une valeur égale à quelque chose.

J'ai (ou pas) une variable $_GET['myvar'] provenant de ma chaîne de requête et je veux vérifier si cette variable existe et aussi si la valeur correspond à quelque chose dans mon instruction if :

Ce que je fais et pense n'est pas la meilleure façon de faire :

if(isset($_GET['myvar']) && $_GET['myvar'] == 'something') : faire quelque chose

Ma question est la suivante : existe-t-il un moyen de faire cela sans déclarer deux fois la variable ?

C'est un cas simple mais imaginez qu'il faille comparer plusieurs de ces cas. $myvar variables.

3 votes

PHP n'a pas de solution pour cela, mais c'est un langage de programmation. Vous pouvez (et devriez) toujours écrire un sous-programme pour raccourcir un code répétitif. Sans oublier que dans un bon programme, chaque variable doit être définie avant d'être utilisée...

24voto

Nick Points 36758

Depuis PHP7, vous pouvez utiliser l'option Opérateur de coalescence nul ?? pour éviter la double référence :

// $_GET['myvar'] isn't set...
echo ($_GET['myvar'] ?? '') == 'hello' ? "hello!\n" : "goodbye!\n";

// $_GET['myvar'] is set but != 'hello'
$_GET['myvar'] = 'farewell';
echo ($_GET['myvar'] ?? '') == 'hello' ? "hello!\n" : "goodbye!\n";

// $_GET['myvar'] is set and == 'hello'
$_GET['myvar'] = 'hello';
echo ($_GET['myvar'] ?? '') == 'hello' ? "hello!\n" : "goodbye!\n";

Sortie :

goodbye!
goodbye!
hello!

Code Démonstration sur 3v4l.org

En général, l'expression

$a ?? $b

est équivalent à

isset($a) ? $a : $b

Notez que dans l'exemple de code, il est nécessaire de placer des parenthèses autour de $_GET['myvar'] ?? '' como == a une priorité plus élevée que ?? et donc

$_GET['myvar'] ?? '' == 'hello'

s'évaluerait à :

$_GET['myvar'] ?? ('' == 'hello')

ce qui serait vrai tant que $_GET['myvar'] a été fixé et "truthy" (voir l manuel ) et faux sinon (puisque '' == 'hello' est fausse).

Code de priorité Démonstration sur 3v4l.org

0 votes

Que se passerait-il si j'omettais la parenthèse ?

0 votes

@HaLeiVi en raison de la préséance des opérateurs ( == est supérieure à ?? ), $_GET['myvar'] ?? '' == 'hello' serait évalué comme $_GET['myvar'] ?? ('' == 'hello') de sorte qu'il serait évalué à vrai si l'un ou l'autre $_GET['myvar'] n'est pas défini (puisque 'hello' est "véridique") ou si $_GET['myvar'] est une valeur "véridique" (voir php.net/manual/fr/language.types.boolean.php )

22voto

mellowsoon Points 3059

Malheureusement, c'est la seule façon de faire. Mais il existe des approches pour traiter des tableaux plus grands. Par exemple, quelque chose comme ceci :

$required = array('myvar', 'foo', 'bar', 'baz');
$missing = array_diff($required, array_keys($_GET));

La variable $missing contient désormais une liste de valeurs requises, mais manquantes dans le tableau $_GET. Vous pouvez utiliser le tableau $missing pour afficher un message au visiteur.

Ou vous pouvez utiliser quelque chose comme ça :

$required = array('myvar', 'foo', 'bar', 'baz');
$missing = array_diff($required, array_keys($_GET));
foreach($missing as $m ) {
    $_GET[$m] = null;
}

Maintenant, chaque élément requis a au moins une valeur par défaut. Vous pouvez maintenant utiliser if($_GET['myvar'] == 'something') sans craindre que la clé ne soit pas définie.

Mise à jour

Une autre façon de nettoyer le code serait d'utiliser une fonction qui vérifie si la valeur est définie.

function getValue($key) {
    if (!isset($_GET[$key])) {
        return false;
    }
    return $_GET[$key];
}

if (getValue('myvar') == 'something') {
    // Do something
}

17voto

Si vous cherchez une ligne unique pour vérifier la valeur d'une variable dont vous n'êtes pas sûr qu'elle soit déjà définie, ceci fonctionne :

if ((isset($variable) ? $variable : null) == $value) { }

Le seul inconvénient possible est que si vous faites des tests pour true / false - null sera interprété comme étant égal à false .

6 votes

Il est préférable de suggérer === que == car il n'aura pas les inconvénients que vous mentionnez.

8 votes

Si vous utilisez PHP7, cela peut être plus simple if (($variable ?? null) === $value) .

1voto

Victor Points 695

Comme le suggère mellowsoon, vous pourriez envisager cette approche :

required = array('myvar' => "defaultValue1", 'foo' => "value2", 'bar' => "value3", 'baz' => "value4");
$missing = array_diff($required, array_keys($_GET));
foreach($missing as $key => $default  ) {
    $_GET[$key] = $default  ;
}

Vous mettez les valeurs par défaut et définissez les paramètres non reçus à une valeur par défaut :)

1voto

Pekka 웃 Points 249607

Ma question est la suivante : existe-t-il un moyen de faire cela sans déclarer deux fois la variable ?

Non, il n'y a aucun moyen de faire cela correctement sans faire deux contrôles. Je déteste ça, aussi.

Une façon de contourner ce problème serait d'importer toutes les variables GET pertinentes à un point central dans un tableau ou un objet quelconque (la plupart des frameworks MVC le font automatiquement) et de définir toutes les propriétés qui sont nécessaires par la suite. (Au lieu d'accéder aux variables de requête à travers le code).

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