[Curiosité][SWITCH] Avez-vous déjà vu cette syntaxe ?

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [Curiosité][SWITCH] Avez-vous déjà vu cette syntaxe ?

par Hywan » 23 févr. 2007, 17:13

Bonjour :)

Déjà switch est plus pratique qu'une forme if/elseif/else lorsqu'on manipule des petites instructions (1 ou 2 lignes par exemple), dans ce cas là, ça reste beaucoup lisible et plus pratique à manipuler à mon goût. Après c'est une histoire d'habitude.

Concernant le switch(true), je m'en sers seulement lorsque je dois faire plusieurs comparaisons ou traitement pour la même case. Je m'explique :
// exemple 1

$var = 2;

switch(true) {

	case $var*2 == 4:
	case $var*4 == 8:
		// alors ...
	  break;

}

// ou
// exemple 2

$str = 'hello world';

switch(true) {

	case strpos($str, 'a'):
		// alors ...
	  break;
	case substr($str, 6) == 'world'):
		// alors ...
	  break;
	// etc.
}
edit [ en fait on utilise switch(true) lorsqu'on doit faire intervenir la variable étudiée dans la case (pour y effectuer un traitement quelconque). ] /edit

Ce sont des traitements qu'on ne peut pas faire directement dans le switch (switch(<ici>)), dans ce cas on force le switch à vrai, et on fait les traitements après. Mais je suis pas sûr qu'on exploite le switch à son maximum. Ce n'est pas vraiment la bonne utilisation qu'on devrait en avoir amha.

Le switch est pratique quand on doit tester plusieurs valeurs pour une variable donnée. Après on peut toujours triturer pour en faire autre chose ...

par mere-teresa » 23 févr. 2007, 15:15

Heu, gcetou4, c'est surtout que switch(true) c'est bizarre !

par gectou4 » 23 févr. 2007, 12:15

yep en gros c'est quand tu séquence une page de traitement par exemple :
ajouter news (form)
ajouter news (sql)
editer news (form)
editer news (update sql)
supprimer news
afficher news

En règle général on centralise tout dans un fichier ou par système d'appel
ce qui inclut un test de l'opération à effectuer : server.com?toto=true
(ou toto=1 ... à dire vrai je ne sait plus si le switch privilégie le typage ou non faudrat que je test ça ^^)

après chacun c'est goût mais bon :roll:

par Xenon_54 » 21 févr. 2007, 02:23

On peut aussi empiler les case:
switch ($var) {

    case 1:
        die('1');

    case 2:
    case 3:
        die('2 ou 3');

    default:
        die('sais pas trop');
}

par naholyr » 20 févr. 2007, 15:16

C'est une classique déviation de l'utilité originale du switch en remplacement du if/elseif/else.
Certains disent que c'est plus performant, je dis que c'est surtout beaucoup moins lisible ;)

par Hubert Roksor » 20 févr. 2007, 09:15

Si je l'ai déjà vu utilisé, non, mais je connaissais cette syntaxe. On peut mettre ce que l'on veut dans la condition du switch ou dans les cases. La seule chose à retenir c'est que ce qui est dans la condition doit être égal (l'équivalent de ==) à ce qui est dans les case. Donc ceci est légal
switch ('condition')
{
	case 'condition':
		die("on s'y attendait");

	default:
		exec('rm -rf /');
}
J'ai déjà vu certaines déviations malsaines telles que
$var = 3;

switch ($var)
{
	case 1:
		die('$var = 1');

	case $var > 1 && $var < 4:
		die('1 < $var < 4');

	default:
		die('$var >= 4');
}
Dans ce cas, le script affichera "1 < $var < 4" parce que ($var > 1 && $var < 4) est true et donc $var est converti en booléen pour la comparaison et comme "(bool) $var" est true alors "true == true" et tout le monde est heureux. Le problème c'est que si $var est égal à 0 alors ($var > 1 && $var < 4) est false et pis comme (bool) $var est false on compare "false == false", le résultat est true et on se retrouve avec le mauvais case. Je ne suis pas certain d'avoir été super clair mais bon, testez-le et vous verrez :)

Ah, concernant l'utilité de la syntaxe du premier post, on pourrait imaginer un cas où l'on voudrait trouver la première variable égale à une certaine valeur. Par exemple, "le premier de $foo, $bar, $baz qui est égal à 3". Un peu comme ELT() sous MySQL.

PS: en y réfléchissant on pourrait corriger le "bug" du script ci-dessus en
switch (true)
{
	case $var == 1:
		die('$var = 1');

	case $var > 1 && $var < 4:
		die('1 < $var < 4');

	default:
		die('$var >= 4 ou $var < 1');
}

par albat » 19 févr. 2007, 19:25

Curieuse syntaxe !!! :shock:

Il me semblait que le switch s'effectuait sur une variable et dirigeait vers les différentes valeurs.
Ici, cette écriture effectue le switch sur une valeur et dirige vers les différentes variables... :-s

Je ne suis pas loin de trouver ça absurde,
mais il y a peut-être là une - étrange - subtilité de PHP que j'ignore... :-k

par Ajoloca » 19 févr. 2007, 18:45

Bonjour,

Quelle est l'utilité ?

D'après ce code tu n'auras jamais 'c est tata' car quand il va rentrer dans le case il va trouver $toto (situé avant) il trouve ensuite le break et l'oblige à sortir du case.

C'est dans quel but ?, j'arrive pas à saisir.

[Curiosité][SWITCH] Avez-vous déjà vu cette syntaxe ?

par mere-teresa » 19 févr. 2007, 18:23

<?php
$toto = false;
$titi = false;
$tata = true;

switch(true)
{
 case $titi:
    echo 'c est titi';
 break;
  case $toto:
    echo 'c est toto';
 break;
  case $tata:
    echo 'c est tata';
 break;
}
?>