Catégories

Je les lis (et ils le valent bien!)

php étonnement sur le default du switch

Comme Mageekguy, mais à un moindre niveau, cela va faire un bon nombre d’années que je fais du développement PhP et j’arrive encore à être étonné et à découvrir des choses. Je vous conseille au passage de vous abonnez à son blog Mageekblog si vous faites du développement PhP.
Dernièrement, dans l’équipe avec laquelle je travaille, nous sommes tombés sur un vieux bout de code qui nous a paru très étrange : Un switch avec le default déclaré en premier.

Notre première réaction a été de nous dire qu’il y avait un bug et qu’on était face à du code inutile. A savoir : default, on y entre dans tous les cas, donc on exécute son break et on sort du switch sans jamais avoir vérifié les autres case.

Et bien non ! Après tests, il se trouve que php va d’abord vérifier tous les cases (dans leur ordre de présentation) et va garder le default pour la fin, et ce où que soit placer le default. Après on est d’accord que pour la bonne lecture et compréhension du code, il est plus logique de placer le default en dernier…

$test = 1;
switch($test){
    default :
        echo "default";
        break;
    case 1:
        echo "test 1";
        break;
    case 2:
        echo "test 2";
        break;
}

Affiche : test 1

Un peu curieux, je tente de retirer le break du default. Et là je corrige ce que je viens de dire : il ne garde pas le default pour la fin ! En effet, si on ne met pas le break dans un case, si la condition du case est remplie, elle s’exécute et tant qu’il ne rencontre pas de break, il va entrer dans les case suivants pour les exécuter (même si la condition n’est pas remplie, on ne fait pas la vérification puisqu’on est rentré dans un)

$test = 0;
switch($test){
    default :
        echo "default - ";
    case 1:
        echo "test 1 - ";
    case 2:
        echo "test 2 - ";
}

Affiche : default – test 1 – test 2 –

Donc bien dans l’ordre où est fait le code mais par contre cela veut dire qu’il a parcouru une première fois les case pour vérifier qu’aucune condition n’est rempli puis qu’il repart en haut du switch, dans le default, pour faire les exécutions.

Ce qui fait que je me pose la question de la performance entre

$test = 0;
switch($test){
    default :
        echo "a";
        break;
    case 1:
        echo "b";
        break;
    case 2:
        echo "b";
        break;
}

et

$test = 0;
switch($test){
    case 1:
        echo "b";
        break;
    case 2:
        echo "b";
        break;
    default :
        echo "a";
        break;
}

Pour tester le benchmark, j’ai utilisé une méthode classique tel qu’on en trouve partout sur internet (par exemple Tests et benchmark en PHP 5 sur developpez.com)

Les temps sont significativement identique. Vous pouvez aller voir sur : http://cyol.fr/blog/wp-content/uploads/billets/php-etonnement-sur-le-default-du-switch/test_switch.php

Par curiosité, j’ai testé aussi avec Javascript, et on retrouve le même comportement qu’en php.

Leave a Reply

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

  

  

  

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.