L'arrivée officielle de PHP 5.3 annonce aussi l'apparition de l'instruction controversée "goto". Certains l'apprécient, d'autres la détestent, mais une chose est sûre, c'est qu'on devra traiter avec elle à l'avenir.
Présent dans plusieurs autres langages, le programmeur qui voudra utiliser GOTO pourra le faire en indiquant une étiquette (label) où le script fera le saut à l'endroit spécifié dans le code pour poursuivre l'exécution. Heureusement, le goto de PHP est restrictif : le saut et le label d'arrivée doivent se trouver dans le même fichier et le même contexte pour que ça fonctionne. L'utilisation suggérée est de faire un bris (break) à l'intérieur de boucles imbriquées:
for($i=0,$j=50; $i<100; $i++) {Toutefois, bien que ça puisse rendre service dans certaines circonstances, l'apparition de cette commande présente aussi un côté négatif : certains développeurs risquent d'en abuser. Non seulement le résultat devient du code spaghetti, il ne sera pas compatible avec les plus vieilles versions de PHP et sera plus difficile à suivre. D'ailleurs, il y a un excellent comic à lire à ce sujet sur xkcd.
while($j--) {
if($j==17) goto end;
}
}
echo "i = $i";
end:
echo 'j hit 17';
Comme le mentionnait Johannes Schlüter (release manager pour la version PHP 5.3), il existe au moins deux cas où ça peut être pratique:
- dans un générateur de code
- pour annuler l'exécution d'une portion de code tout en s'assurant d'effectuer le nettoyage à la fin
function process_file($filename) {Gardez en tête que c'est présent mais surtout, évitez de l'utiliser le plus possible, sauf en cas d'extrême nécessité. Il y a toujours une autre approche possible (il suggère un break ou un try/catch).
$fp = fopen($filename, "r");
if (!$fp) {
goto cleanup;
}
$row = fread($fp, 1024);
// do something with the row
if ($error_while_processing) {
goto cleanup;
}
$a_few_bytes = fread($fp, 4);
// do something again ...
if ($error_while_processing) {
goto cleanup;
}
/* ... */cleanup:
fclose($fp);
}