IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Comment échapper une série de if si condition remplie


Sujet :

Langage PHP

  1. #1
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    Points : 1 935
    Points
    1 935
    Par défaut Comment échapper une série de if si condition remplie
    Bonjour Toutes et Tous,

    En ce langage PHP je patine pour une chose pourtant toute bête.

    Comment pourrais-je optimiser le principe du code suivant, sachant qu'en omettant les "exit" ça fonctionne, sauf que c'est un peu crade...

    D'un autre côté, avec les "exit", ça fonctionne, mais le code plus bas ne sera pas exécuté.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    	if ($jour === 'lundi') 
    	{
    		Mon code...
    		exit;
    	}
     
    	if ($jour === 'mardi') 
    	{
    		Mon code...
    		exit;
    	}
     
    	if ($jour === 'mercredi') 
    	{
    		Mon cede...
    		exit;
    	}
     
     
    echo 'Je dois encore être visible moi !';

    Merci d'avance de vos lumières

    DS7

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 267
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 267
    Points : 8 565
    Points
    8 565
    Billets dans le blog
    17
    Par défaut
    Le problème avec ton script est que tu évalues toujours tous les if(), et dans le lot il y aura des évaluations inutiles.

    Tu pourrais faire un switch() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    switch ($jour) {
        case 'lundi':
            echo 'Nous sommes lundi';
            break;
        case 'mardi':
            echo 'Nous sommes mardi';
            break;
        //...
    }
     
    echo 'Je suis la suite...';
    Alternativement avec if/elseif :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if ($jour === 'lundi') {
        echo 'Nous sommes lundi';
    } elseif ($jour === 'mardi') {
        echo 'Nous sommes mardi';
    } elseif ($jour === 'mercredi') {
        //...
    }
     
    echo 'Je suis la suite...';
    Ici les elseif() suivants le 1er match ne sont pas évalués, mais il y a des tests identiques répétés. Je préfère malgré tout cette structure au switch() car plus lisible.

    D'autres formes sont possibles selon la nature de ton code, ex. avec les nouvelles fonctions fléchées :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $handlers = [
        'lundi' => fn() => 'Nous sommes lundi',
        'mardi' => fn() => 'Nous sommes mardi',
        // ...
    ];
    echo $handlers[$jour]();
    echo 'Je suis la suite...';

  3. #3
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    Points : 1 935
    Points
    1 935
    Par défaut
    Whaouhh merci Seb, je vais voir ça demain.

    En effet j'avais zappé les if/elseif permettant d'être dans la même structure sans sortir à chaque comparaison.

    Demain tranquillement je vais voir tout ça.

    @ demain

  4. #4
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 628
    Points
    3 628
    Billets dans le blog
    8
    Par défaut
    Dans le code que tu nous présentes, il y a 2 problèmes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	if ($jour === 'mercredi') 
    	{
    		//Mon code du mercredi...
    		exit;
    	}
    1) Tu n'as pas besoin de mettre systématiquement "===" pour comparer.
    Ici "==" suffit. En effet, dès l'instant où ta variable est "mercredi", c'est forcément le type string. Or, === sert à comparer la valeur ET le type. C'est essentiellement utile quand tu recherches par exemple la valeur 1 et pas la valeur true, ou réciproquement.
    Tu vas alors écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ($ma_variable===1){
       echo "C'est bien le chiffre 1 et pas true !";
    }
    2) Enfin, ici, ce qui te coince pour aller au delà des 'if', c'est simplement tes 'exit', tout à fait inutiles.
    Ton code (ta suite de if qui s'excluent les uns les autres) fonctionnerait comme tu le souhaites sans les exit.
    Mais ce n'est pas une bonne pratique.

    Car les

    if...
    elseif...
    elseif...
    elseif...
    else...

    autrement dit un système conditionnel est plus adapté. Parce que toi, ça te rappelle qu'on ne passe que par une condition et jamais 2, on sort du système conditionnel dès qu'une condition est réalisée. D'autre part, le code est aussi plus performant, puisqu'il sort aussi à la première condition réalisée.

    Un exemple où l'on comprend bien que simple if et système conditionnel ne sont pas équivalents :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    $text='Bonjour ';
     
    //ne passe pas forcément par là.
    if($age < 25){
       $text.='jeune ';
    }
     
    //passe forcément par un des 3
    if($genre=='F'){
       $text.='madame, ';
    }
    elseif($genre=='H'){
       $text.='monsieur, ';
    }
    else{
       $text.='vous, '; //par défaut, quand la variable genre est vide par exemple
    }
     
    echo $text;

  5. #5
    Membre éclairé
    Femme Profil pro
    Autre
    Inscrit en
    Janvier 2017
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Janvier 2017
    Messages : 335
    Points : 715
    Points
    715
    Par défaut
    Bonjour,
    Citation Envoyé par Dendrite Voir le message
    Or, === sert à comparer la valeur ET le type.
    === paraît plus lourd dit comme ça, mais en fait, l'algorithme derrière == est encore plus compliqué.

    == fait aussi une analyse des types.
    === est plus simple car si les types sont différents, il ne va pas plus loin et renvoie false, alors que == continue son analyse.

    Du coup :
    Citation Envoyé par Dendrite Voir le message
    Tu n'as pas besoin de mettre systématiquement "===" pour comparer.
    Ici "==" suffit.
    Je dirais l'inverse :
    Sauf cas particulier, il n'y a pas besoin de mettre == pour comparer.
    === suffit.

    La question à se poser :
    La valeur de ma variable doit être identique à celle comparée (===) ou lui ressembler (==) ?

    Avec la comparaison laxiste, le programme est moins carré et perd en clarté (à la différence de if($a=='1'), quand on voit if($a==='1'), on sait tout de suite qu'on travaille avec des chaînes).
    Et surtout, cela peut être source d'erreurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $_POST['codePromo']='123'; //saisie de l'utilisateur
     
    if($_POST['codePromo']=='0123')
    	{
    	echo '10% de remise !'; //on rentre ici alors que le code n'est pas valide
    	}
    else
    	{
    	echo 'Code non valide.';
    	}
    Même dans le cas où les types sont différents, je conseille pour ma part de passer par une conversion explicite du type et d'utiliser une comparaison stricte.

  6. #6
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    Points : 1 935
    Points
    1 935
    Par défaut
    Bonjour Toutes et Tous,

    J'ai grâce à vous trouvé en ce problème mon bonheur.

    Petit à petit j'assimile les nuances de comparaisons PHP.

    Je suis sur un autre langage moins chichiteux à ce niveau comparaison.

    Mais certainement parce qu'à la base il est extrêmement typé et toute déclaration en amont est obligatoire.

    Merci !

  7. #7
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 628
    Points
    3 628
    Billets dans le blog
    8
    Par défaut
    @Loralina : Merci !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Batch] Comment renommer une série de fichiers en minuscule
    Par Olivier Regnier dans le forum Scripts/Batch
    Réponses: 6
    Dernier message: 22/09/2017, 11h22
  2. Comment modifier une série de fichiers texte ?
    Par noufel dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 20/05/2010, 21h01
  3. [VB.Net 1.1] Comment "échapper" une quote ?
    Par arnolem dans le forum VB.NET
    Réponses: 1
    Dernier message: 07/09/2006, 11h39
  4. Réponses: 2
    Dernier message: 17/08/2005, 15h40
  5. Réponses: 7
    Dernier message: 03/12/2004, 11h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo