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

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

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;
}
?>
Modifié en dernier par mere-teresa le 22 févr. 2007, 12:35, modifié 1 fois.
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

ViPHP
ViPHP | 1961 Messages

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.
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

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

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

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');
}

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

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 ;)

Mammouth du PHP | 1885 Messages

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');
}
La programmation est l'expression de la poésie d'un programmeur
Génération PHP

Eléphanteau du PHP | 20 Messages

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:

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

23 févr. 2007, 15:15

Heu, gcetou4, c'est surtout que switch(true) c'est bizarre !
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

ViPHP
ViPHP | 4674 Messages

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 ...
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).