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');
}
Si je l'ai déjà [i]vu[/i] 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
[php]switch ('condition')
{
case 'condition':
die("on s'y attendait");
default:
exec('rm -rf /');
}[/php]
J'ai déjà vu certaines déviations malsaines telles que
[php]$var = 3;
switch ($var)
{
case 1:
die('$var = 1');
case $var > 1 && $var < 4:
die('1 < $var < 4');
default:
die('$var >= 4');
}[/php]
Dans ce cas, le script affichera "1 < $var < 4" parce que ($var > 1 && $var < 4) est [b]true[/b] et donc [b]$var[/b] est converti en booléen pour la comparaison et comme "(bool) $var" est [b]true[/b] alors "true == true" et tout le monde est heureux. Le problème c'est que si [b]$var[/b] est égal à [b]0[/b] alors ($var > 1 && $var < 4) est [b]false[/b] et pis comme (bool) $var est [b]false[/b] on compare "false == false", le résultat est [b]true[/b] 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[php]switch (true)
{
case $var == 1:
die('$var = 1');
case $var > 1 && $var < 4:
die('1 < $var < 4');
default:
die('$var >= 4 ou $var < 1');
}[/php]