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 :

Fonctionnement de l'instruction switch()


Sujet :

Langage PHP

  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 587
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 587
    Points : 811
    Points
    811
    Par défaut Fonctionnement de l'instruction switch()
    Bonjour à tous,
    J'ai le code suivant:
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    switch($page)
    {
    	/*
    	case 1:
    	case 2:
    	case 3:
    	case 4:
    	case 5:
    		require_once VIEW_PAGE.'userMenu.php';
    	*/
    	case 1:		// contact list
    		require_once VIEW_PAGE.'userMenu.php';
    		require_once VIEW_PAGE.'list.php';
    		break;
    	case 2:		// maincard
    		require_once VIEW_PAGE.'userMenu.php';
    		require_once VIEW_PAGE.'cardForm.php';
    		break;
    	case 3:		// new family's member
    		require_once VIEW_PAGE.'userMenu.php';
    		require_once VIEW_PAGE.'editMember.php';
    		break;
    	case 4:		// edit address
    		require_once VIEW_PAGE.'userMenu.php';
    		require_once VIEW_PAGE.'editAddress.php';
    		break;
    	case 5:		// edit member
    		require_once VIEW_PAGE.'userMenu.php';
    		require_once VIEW_PAGE.'editMember.php';
    		break;
    	case 101:	// login
    	case 102:	// demo
    		require_once DIR_CONTROLLER.'login.php';
    		break;
    	case 110:	// forms treatment
    		require_once DIR_CONTROLLER.'cardFormHandler.php';
    		break;
    	case 190:	// logout
    		unset($_SESSION);
    		unset($_COOKIE['code']);
    		$page = 0;
    		//break;
    	default:
    		require_once VIEW_PAGE.'homeMenu.php';
    		require_once VIEW_PAGE.'connect.php';
    		require_once VIEW_PAGE.'home.php';
    		break;
    }
    Dans ce code, afin de ne pas répéter l'instruction require_once VIEW_PAGE.'userMenu.php';, j'ai essayé d'insérer le code en commentaire. Je ne comprend pas pourquoi le cas 1 est toujours exécuté alors que page vaut entre 2 et 5.

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 193
    Points : 8 403
    Points
    8 403
    Billets dans le blog
    17
    Par défaut
    1 seul case est exécuté (le premier qui vérifie la condition) jusqu'au premier break rencontré.

    Si ma réponse ne te suffit pas montre-nous un cas concret à exécuter.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  3. #3
    Membre expert
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 780
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 780
    Points : 3 033
    Points
    3 033
    Par défaut
    Bonsoir

    Puisque tu as mis un break pour chaque proposition, il est impossible que switch exécute plus d'une option.

    Un conseil : rends ton code lisible (self explained en anglais). Qu'est-ce que 1 ? Qu'est-ce que 2 ? Qu'est-ce que 101 ? Là tu écris en commentaire "login" du coup pourquoi ne pas utiliser la valeur login et non un code arbitraire 101 ?

    Bonne soirée
    Christophe (cavo789)
    Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be

  4. #4
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 587
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 587
    Points : 811
    Points
    811
    Par défaut
    Il s'agit du routeur de la page index. La variable testé est un numéro de page vers lequel la redirection doit se faire. Le code en commentaire ne comporte pas de break pour être exécuté avant et en plus des cas suivants pour éviter d'avoir à répéter le require_once pour les cas 1 à 5 qui sont les vues et qui nécessitent toutes le menu principal (d'où le require).
    Les cas au-delà de 100 sont des contrôleurs. Ils ne posent aucune difficultés et ne sont pas concernés par ce code en commentaire.

  5. #5
    Membre expert
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 780
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 780
    Points : 3 033
    Points
    3 033
    Par défaut
    Ne trouves-tu pas que "case 'login'" est bien plus parlant que "case 101"? C'est ça mon propos, n'utilise pas le code 101 mais un texte qui décrit exactement ce que tu fais / veux.

    Au moins "pire", tu pourrais définir une constante LOGIN_PAGE=101 et du coup "case LOGIN_PAGE" serait aussi quelque chose de parlant.
    Christophe (cavo789)
    Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be

  6. #6
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Bonjour,
    Citation Envoyé par moimp Voir le message
    ... Le code en commentaire ne comporte pas de break pour être exécuté avant et en plus des cas suivants pour éviter d'avoir à répéter le require_once pour les cas 1 à 5 qui sont les vues et qui nécessitent toutes le menu principal (d'où le require)...
    Comme l'indique Séb. , tu ne peux pas procéder de la sorte.
    Si tu ne veux pas écrire 5 fois ta ligne de code require_once VIEW_PAGE.'userMenu.php'; , tu dois la traiter avant le switch (la doc décrit très bien le principe avec la break) ; par exemple avec la méthode in_array.

    Ce qui te donnerait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if (in_array($page, array(1,2,3,4,5))) { require_once VIEW_PAGE.'userMenu.php'; }
    switch($page){
    	case 1:		// contact list
    		require_once VIEW_PAGE.'list.php';
    		break;
    	case 2:		// maincard
    		require_once VIEW_PAGE.'cardForm.php';
    		break;
    ...
    La remarque de cavo789 sur les constantes permet une compréhension et une maintenance plus facile.

    Bonne programmation.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  7. #7
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 430
    Points : 5 784
    Points
    5 784
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    la suggestion de rv26t est séduisante, mais je pense qu'il manque des case dans le in_array : if (in_array($page, array(1,2,3,4,5,101,102,110))). Mais comment traiter le case default ?

    La remarque de cavo789 sur les constantes permet une compréhension et une maintenance plus facile.
    Tout à fait d'accord.
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  8. #8
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 587
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 587
    Points : 811
    Points
    811
    Par défaut
    Merci à tous pour vos éclaircissements et vos conseils.

  9. #9
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Citation Envoyé par laurentSc Voir le message
    la suggestion de rv26t est séduisante, mais je pense qu'il manque des case dans le in_array : if (in_array($page, array(1,2,3,4,5,101,102,110))). Mais comment traiter le case default ?
    Non, non.
    Relis la demande
    Citation Envoyé par moimp Voir le message
    ... pour éviter d'avoir à répéter le require_once pour les cas 1 à 5 ...
    Les cas au-delà de 100 sont des contrôleurs. Ils ne posent aucune difficultés ...
    le if (in_array($page, array(1,2,3,4,5))) traite les cas de 1 à 5 comme demandé, et seulement ceux-la.

    Bonne soirée
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  10. #10
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 430
    Points : 5 784
    Points
    5 784
    Billets dans le blog
    1
    Par défaut
    T'as raison, j'ai lu trop vite.
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

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

Discussions similaires

  1. [Débutant] Instruction switch ne fonctionne pas
    Par popy67 dans le forum C#
    Réponses: 6
    Dernier message: 14/08/2012, 10h10
  2. Petit doute sur l'instruction "switch"
    Par SybVicious dans le forum Débuter
    Réponses: 6
    Dernier message: 28/08/2007, 10h57
  3. Probleme instruction switch
    Par mpascolo dans le forum Langage
    Réponses: 7
    Dernier message: 17/10/2006, 11h14
  4. instruction switch
    Par artatum dans le forum C
    Réponses: 5
    Dernier message: 28/09/2005, 17h20
  5. [Info] Instruction switch
    Par HNT dans le forum Langage
    Réponses: 6
    Dernier message: 23/09/2005, 16h47

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