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 :

Question sur opérateur ternaire


Sujet :

Langage PHP

  1. #1
    Membre actif
    Inscrit en
    Février 2009
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 616
    Points : 249
    Points
    249
    Par défaut Question sur opérateur ternaire
    Bonjour,

    Rappel => condition?resultat1:resultat2

    Récemment, j'ai remarqué que l'on pouvait mettre un opérateur ternaire dans un opérateur ternaire, que pensez-vous de type de syntaxe ?

    Ex => condition?resultat1:condition?resultat2:resultat3

    Merci pour vos réponses,

  2. #2
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Cette syntaxe est bonne, mais il faut voir aussi la lisibilité des codes.
    Chacun à son habitude.

  3. #3
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    personnellement je déconseille fortement l'imbrication des opérateurs ternaires.
    L'opérateur ternaire ne doit servir que pour des cas basiques.

    En général, il faut faire gaffe avec l'abus de sucres syntaxiques car cela flingue à grande vitesse la lisibilité du code voire même la compréhension du déroulement logique...

    un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return (a<b) ? (b<c) ? b : (a<c) ? c : a : (a<c) ? a : (b<c) ? c : b;
    et ben je dis : bonne chance... pour y retrouver tes petits

  4. #4
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Citation Envoyé par andry.aime Voir le message
    Chacun à son habitude.
    Chacun à ses habitudes mais il ne faut pas perdre de vue qu'il y'a de forte chance que le code que l'on produit aujourd'hui sera repris par d'autre plus tard. Donc si on peut éviter de produire du code imbitable c'est pas plus mal .

    Perso l'opérateur ternaire je le réserve exclusivement au comparaison très simple.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre actif
    Inscrit en
    Février 2009
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 616
    Points : 249
    Points
    249
    Par défaut
    Ok merci pour vos réponses,
    j'ai résolu le problème par un simple commentaire, j'ai également du mal à me relire plusieurs semaines après...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    // Opérateur ternaire imbriqué sur la première condition
    Bonne journée,

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    dans ton cas, la solution simple est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    resultat4 = (condition)?resultat2:resultat3;
    resultat5 = (condition)?resultat1:resultat4;

  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 : 58
    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 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Tout le monde n'a pas le sens collectif et certains s'imaginent bêtement que plus leur code est tortueux, plus ils seront irremplaçables.
    Faut voir un psy, quand on veut passer pour irremplaçable, car les cimetières sont remplis de gens irremplaçables.
    Je ne dis pas ça contre toi dominos, je ne te connais pas, je dis ça contre des collègues dont j'ai hérité du code une fois qu'ils étaient partis de la boîte. J'étais très en colère contre leur bêtise et leur prétention.
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  8. #8
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Cette pratique est officiellement non recommandé :
    Il est recommandé de ne pas "empiler" les expressions ternaires. Le comportement de PHP lors de l'utilisation de plus d'un opérateur ternaire dans une seule instruction n'est pas évident
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  9. #9
    Membre actif
    Inscrit en
    Février 2009
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 616
    Points : 249
    Points
    249
    Par défaut
    Citation Envoyé par Dendrite Voir le message
    Tout le monde n'a pas le sens collectif et certains s'imaginent bêtement que plus leur code est tortueux, plus ils seront irremplaçables.
    Faut voir un psy, quand on veut passer pour irremplaçable, car les cimetières sont remplis de gens irremplaçables.
    Je ne dis pas ça contre toi dominos, je ne te connais pas, je dis ça contre des collègues dont j'ai hérité du code une fois qu'ils étaient partis de la boîte. J'étais très en colère contre leur bêtise et leur prétention.
    Voici le petit bout de code en clair...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php echo (!empty($operation['cpj_solde']))?number_format($operation['cpj_solde'], 2, ',', ' ')."€":(!empty($shwClrSolde))?number_format($operation['cpj_dernierSolde'], 2, ',', ' ')."€":""; // Opérateur ternaire imbriqué sur la première condition ?>
    Vous pensez qu'il faut que je consulte ?

  10. #10
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Citation Envoyé par dominos Voir le message
    Vous pensez qu'il faut que je consulte ?
    De toute urgence oui. C'est toi qui vois mais si d'ici quelques semaines/mois tu dois modifier ce code et que tu mets des plombes à le comprendre - en tous cas bien plus longtemps que s'il était écrit sous une forme simple - tu vas te demander quel est le cacou qui a bien pu pondre ce code de malade

    A savoir qu'il y a plusieurs dizaines de milliers de ligne de code dans un petit site standard... penses à l'avenir

    Enfin bon on a vu bien pire mais disons que tu n'es pas sur la bonne voie. jreaux62 t'a donné une bonne méthode pour empiler des opérateurs ternaires. Après faut pas non plus que ce soit une religion. Les opérateurs ternaires sont conçus pour fournir une alternative plus lisible/pratique que la structure if/else donc pas la peine de les utiliser si au final ce n'est pas le cas.
    D'autant plus que si tu fais des bench tu t'apercevras qu'il n'y a bien souvent aucune différence et quand il y en a une (infinitésimale) elle est toujours en faveur de la structure if/else. Comme quoi ce qui prend le moins de place à l'écran n'est pas forcément le plus optimisé pour l'exécution du code. Bilan total : moins lisible, moins rapide et plus compliqué à écrire (comme le rappelle sabotage). Comment défendre un tel bilan sans passer pour un peu dérangé ?

  11. #11
    Membre actif
    Inscrit en
    Février 2009
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 616
    Points : 249
    Points
    249
    Par défaut
    @ABCIWEB

    Avec de tels arguments, je veux bien revoir ce morceau de code.
    Merci pour vos réponses,
    Bonne continuation.

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Avril 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 6
    Points : 7
    Points
    7
    Par défaut Compilé VS interprété: pas la même logique de programmation
    Salut dominos,

    J'arrive un peu tard dans la discussion, juste pour préciser ceci: la logique de programmation n'est pas du tout la même pour un langage compilé ou un langage interprété. En ce sens, il ne faut pas se laisser abuser par la plupart des langages de scripts serveurs ou clients, qui ont formellement une grande proximité avec C/C++ mais ne sont pas du tout exécutés de la même manière.

    Dans un langage compilé, d'autant si la compilation se fait en deux ou trois passes, plus le code source est dense, plus le code exécutable a de chances de l'être, que l'écriture du code soit assez standard ou use de formes rares. Dans un langage interprété, un code source développé et assez standard évite de trop solliciter le parser et donc de limiter le travail d'analyse syntaxique, qui est le plus coûteux en temps de calcul. Par nécessité, quand l'analyseur PHP tombera sur ta séquence «économique», il va devoir la développer en plusieurs passes jusqu'à obtenir au final une forme qui ressemble beaucoup à la version non optimisée formellement, il sera donc préférable d'écrire directement la forme développée, qui réduira le temps d'analyse du code source.

    Au-delà du fait de savoir si, dans un souci de maintenance, une forme dense sera plus ou moins facile à comprendre lors de la lecture du code source, question qui peut se régler avec des commentaires nombreux et explicites, par le fait un script plus standard dans sa forme réduira donc le temps de création de la page dynamique et le délai d'affichage du résultat.

  13. #13
    Membre actif
    Inscrit en
    Février 2009
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 616
    Points : 249
    Points
    249
    Par défaut
    Merci pour ces info complémentaires,

    En suivant la méthode proposée par jreaux62 cela donne ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
         $condition = (!empty($shwClrSolde))?number_format($operation['cpj_dernierSolde'], 2, ',', ' ')."€":""; 
         echo (!empty($operation['cpj_solde']))?number_format($operation['cpj_solde'], 2, ',', ' ')."€":$condition;
    je ne vois pas trop la différence si ce n'est plus simple à lire avec la précedente synthaxe...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo (!empty($operation['cpj_solde']))?number_format($operation['cpj_solde'], 2, ',', ' ')."€":(!empty($shwClrSolde))?number_format($operation['cpj_dernierSolde'], 2, ',', ' ')."€":""; // Opérateur ternaire imbriqué sur la première condition
    Merci

  14. #14
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Le plus simple, le plus logique, et le plus lisible*, c'est quand même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if(!empty($operation['cpj_solde'])){
    	$result = number_format($operation['cpj_solde'], 2, ',', ' ')."€";
    } elseif(!empty($shwClrSolde)){
    	$result = number_format($operation['cpj_dernierSolde'], 2, ',', ' ')."€";
    } else {
    	$result = '';
    }
    echo $result;
    * donc le plus facile à déboguer et/ou maintenir !

    D'autant qu'une seule opération number_format() est nécessaire (au lieu de 2 avec la formulation ternaire).

    Vouloir absolument utiliser les opérateurs ternaires dans ce cas tient plus de l'orgueuil et de l'acharnement que de la logique et la performance.
    Dernière modification par Invité ; 18/05/2016 à 10h59.

  15. #15
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Citation Envoyé par dominos Voir le message
    Merci pour ces info complémentaires,

    En suivant la méthode proposée par jreaux62 cela donne ça:

    Merci
    Clairement tes 2 solutions sont un calvaire à lire. Tu y arrives sans doute facilement parce que tu viens de l’écrire.

    La solution de jreaux62 ci dessus est plus imposante en nombre de ligne mais se lit de manière fluide , son code est donc clairement meilleur.

    Vouloir écrire le moins de ligne possible n'a aucun intérêt si ce n'est se compliquer la vie et celle de ceux qui reprendrons le code ^_^
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  16. #16
    Membre actif
    Inscrit en
    Février 2009
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 616
    Points : 249
    Points
    249
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    Bonjour,

    Le plus simple, le plus logique, et le plus lisible, c'est quand même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if(!empty($operation['cpj_solde'])){
    	$result = number_format($operation['cpj_solde'], 2, ',', ' ')."€";
    } elseif(!empty($shwClrSolde)){
    	$result = number_format($operation['cpj_dernierSolde'], 2, ',', ' ')."€";
    } else {
    	$result = '';
    }
    echo $result;
    D'autant qu'on n'a plus qu'une opération number_format() à faire.

    Vouloir absolument utilisr les opérateurs ternaires dans ce cas tient plus de l'orgueuil et de l'acharnement que de la logique et la performance.
    C'est la solution que j'ai opté sans le ELSE qui est à mon goût inutile.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $result="";
    if(!empty($operation['cpj_solde'])){
    	$result = number_format($operation['cpj_solde'], 2, ',', ' ')."€";
    } elseif(!empty($shwClrSolde)){
    	$result = number_format($operation['cpj_dernierSolde'], 2, ',', ' ')."€";
    }echo $result;
    Merci à vous.

  17. #17
    Invité
    Invité(e)
    Par défaut
    Toi qui aime la concision...

    1/ Dans ta solution, tu affectes DEUX fois une valeur à $result.
    Ce qui n'est pas le cas avec else.


    2/ echo $result."€";
    Si $result est vide (chaine vide ""), ça affiche quand même €.
    Donc : mauvais choix.
    Dernière modification par Invité ; 18/05/2016 à 15h22.

  18. #18
    Membre actif
    Inscrit en
    Février 2009
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 616
    Points : 249
    Points
    249
    Par défaut
    Effectivement ça m'a affiché le € lorsque la case doit être vide
    le code ci-dessous est corrigé et fonctionne maintenant parfaitement (sans le else),
    merci encore.

  19. #19
    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 : 58
    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 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Exercice pour Dominos, transformer le code suivant en conditions ternaires imbriquées.
    PS : j'espère que je ne me trompe pas sur le fonctionnel...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    if($a%1000==0){
       echo 'bissextile';
    }
    elseif($a%100==0){
       echo 'non bissextile';
    }
    elseif($a%4==0){
       echo 'bissextile';
    }
    else{
       echo 'Non bissextile';
    }
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  20. #20
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    @Dendrite

    c'est assez simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $is_leap = (($year % 100) === 0) ? (($year % 400) === 0) : (($year % 4) === 0);

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. question sur l'opérateur new
    Par deubelte dans le forum Débuter
    Réponses: 54
    Dernier message: 29/03/2010, 10h47
  2. Question sur l'opérateur ::
    Par johnkro dans le forum Langage
    Réponses: 8
    Dernier message: 14/03/2008, 10h13
  3. Questions sur l'opérateur <<
    Par coyotte507 dans le forum C++
    Réponses: 4
    Dernier message: 18/11/2007, 22h54
  4. Question sur une relation ternaire dans un MCD
    Par sylsau dans le forum Schéma
    Réponses: 5
    Dernier message: 05/03/2006, 20h00
  5. question sur les opérateurs
    Par isidore dans le forum C++
    Réponses: 10
    Dernier message: 25/02/2005, 18h46

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