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