{"id":23,"date":"2012-10-19T21:18:00","date_gmt":"2012-10-19T21:18:00","guid":{"rendered":"http:\/\/cyol.fr\/blogwp\/?p=23"},"modified":"2013-11-14T16:43:34","modified_gmt":"2013-11-14T15:43:34","slug":"php-etonnement-sur-le-default-du-switch","status":"publish","type":"post","link":"https:\/\/cyol.fr\/blog\/post\/php-etonnement-sur-le-default-du-switch\/","title":{"rendered":"php \u00e9tonnement sur le default du switch"},"content":{"rendered":"<p><a href=\"https:\/\/cyol.fr\/blog\/wp-content\/uploads\/billets\/icones\/elephpant100.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-110\" title=\"elephpant100\" alt=\"\" src=\"https:\/\/cyol.fr\/blog\/wp-content\/uploads\/billets\/icones\/elephpant100.png\" width=\"100\" height=\"100\" \/><\/a>Comme <a title=\"PhP : On en apprend tous les jours !\" href=\"http:\/\/blog.mageekbox.net\/?post\/2012\/09\/27\/On-en-apprend-tous-les-jours-%21\" hreflang=\"fr\">Mageekguy<\/a>, mais \u00e0 un moindre niveau, cela va faire un bon nombre d&rsquo;ann\u00e9es que je fais du d\u00e9veloppement PhP et j&rsquo;arrive encore \u00e0 \u00eatre \u00e9tonn\u00e9 et \u00e0 d\u00e9couvrir des choses. Je vous conseille au passage de vous abonnez \u00e0 <a title=\"Mageekblog\" href=\"http:\/\/blog.mageekbox.net\/\" hreflang=\"fr\">son blog Mageekblog<\/a> si vous faites du d\u00e9veloppement PhP.<br \/>\nDerni\u00e8rement, dans l&rsquo;\u00e9quipe avec laquelle je travaille, nous sommes tomb\u00e9s sur un vieux bout de code qui nous a paru tr\u00e8s \u00e9trange\u00a0: Un switch avec le default d\u00e9clar\u00e9 en premier.<!--more--><\/p>\n<p>Notre premi\u00e8re r\u00e9action a \u00e9t\u00e9 de nous dire qu&rsquo;il y avait un bug et qu&rsquo;on \u00e9tait face \u00e0 du code inutile. A savoir\u00a0: default, on y entre dans tous les cas, donc on ex\u00e9cute son break et on sort du switch sans jamais avoir v\u00e9rifi\u00e9 les autres <em>case<\/em>.<\/p>\n<p><strong>Et bien non !<\/strong> Apr\u00e8s tests, il se trouve que php va d&rsquo;abord v\u00e9rifier tous les cases (dans leur ordre de pr\u00e9sentation) et va garder le default pour la fin, et ce o\u00f9 que soit placer le default. Apr\u00e8s on est d&rsquo;accord que pour la bonne lecture et compr\u00e9hension du code, il est plus logique de placer le default en dernier&#8230;<\/p>\n<pre class=\"brush:php\">$test = 1;\r\nswitch($test){\r\n    default :\r\n        echo \"default\";\r\n        break;\r\n    case 1:\r\n        echo \"test 1\";\r\n        break;\r\n    case 2:\r\n        echo \"test 2\";\r\n        break;\r\n}<\/pre>\n<p><strong>Affiche : <\/strong>test 1<\/p>\n<p>Un peu curieux, je tente de retirer le break du default. Et l\u00e0 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 <em>case<\/em> est remplie, elle s&rsquo;ex\u00e9cute et tant qu&rsquo;il ne rencontre pas de break, il va entrer dans les <em>case<\/em> suivants pour les ex\u00e9cuter (m\u00eame si la condition n&rsquo;est pas remplie, on ne fait pas la v\u00e9rification puisqu&rsquo;on est rentr\u00e9 dans un)<\/p>\n<pre class=\"brush:php\">$test = 0;\r\nswitch($test){\r\n    default :\r\n        echo \"default - \";\r\n    case 1:\r\n        echo \"test 1 - \";\r\n    case 2:\r\n        echo \"test 2 - \";\r\n}<\/pre>\n<p><strong>Affiche :\u00a0<\/strong>default &#8211; test 1 &#8211; test 2 &#8211;<\/p>\n<p>Donc bien dans l&rsquo;ordre o\u00f9 est fait le code mais par contre cela veut dire qu&rsquo;il a parcouru une premi\u00e8re fois les <em>case<\/em> pour v\u00e9rifier qu&rsquo;aucune condition n&rsquo;est rempli puis qu&rsquo;il repart en haut du switch, dans le default, pour faire les ex\u00e9cutions.<\/p>\n<p>Ce qui fait que je me pose la question de la performance entre<\/p>\n<pre class=\"brush:php\">$test = 0;\r\nswitch($test){\r\n    default :\r\n        echo \"a\";\r\n        break;\r\n    case 1:\r\n        echo \"b\";\r\n        break;\r\n    case 2:\r\n        echo \"b\";\r\n        break;\r\n}<\/pre>\n<p>et<\/p>\n<pre class=\"brush:php\">$test = 0;\r\nswitch($test){\r\n    case 1:\r\n        echo \"b\";\r\n        break;\r\n    case 2:\r\n        echo \"b\";\r\n        break;\r\n    default :\r\n        echo \"a\";\r\n        break;\r\n}<\/pre>\n<p>Pour tester le benchmark, j&rsquo;ai utilis\u00e9 une m\u00e9thode classique tel qu&rsquo;on en trouve partout sur internet (par exemple <a title=\"Tests et benchmark en PHP 5 sur developpez.com\" href=\"http:\/\/m-fernandez.developpez.com\/articles\/php\/bench\/#LI-C\" hreflang=\"fr\">Tests et benchmark en PHP 5 sur developpez.com<\/a>)<\/p>\n<p>Les temps sont significativement identique. Vous pouvez aller voir sur\u00a0: <a title=\"Benchmark switch default\" href=\"https:\/\/cyol.fr\/blog\/wp-content\/uploads\/billets\/php-etonnement-sur-le-default-du-switch\/test_switch.php\" target=\"_blank\">https:\/\/cyol.fr\/blog\/wp-content\/uploads\/billets\/php-etonnement-sur-le-default-du-switch\/test_switch.php<\/a><\/p>\n<p>Par curiosit\u00e9, j&rsquo;ai test\u00e9 aussi avec Javascript, et on retrouve le m\u00eame comportement qu&rsquo;en php.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Comme Mageekguy, mais \u00e0 un moindre niveau, cela va faire un bon nombre d&rsquo;ann\u00e9es que je fais du d\u00e9veloppement PhP et j&rsquo;arrive encore \u00e0 \u00eatre \u00e9tonn\u00e9 et \u00e0 d\u00e9couvrir des choses. Je vous conseille au passage de vous abonnez \u00e0 son blog Mageekblog si vous faites du d\u00e9veloppement PhP. Derni\u00e8rement, dans l&rsquo;\u00e9quipe avec laquelle je travaille, nous sommes tomb\u00e9s sur un vieux bout de code qui nous a paru tr\u00e8s \u00e9trange : Un switch avec le default d\u00e9clar\u00e9 en premier. [&#8230;]<\/p>\n","protected":false},"author":1,"featured_media":110,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,6],"tags":[64,62,116,113],"class_list":["post-23","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-developpement","category-php","tag-curiosite","tag-developpement-2","tag-javascript","tag-php","odd"],"_links":{"self":[{"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/posts\/23","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/comments?post=23"}],"version-history":[{"count":11,"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/posts\/23\/revisions"}],"predecessor-version":[{"id":172,"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/posts\/23\/revisions\/172"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/media\/110"}],"wp:attachment":[{"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/media?parent=23"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/categories?post=23"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/tags?post=23"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}