International PHP Conference Berlin 2025

goto

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

Quelle est la chose la plus bizarre lors de l'utilisation de goto ?

Image fournie par » xkcd

L'opérateur goto peut être utilisé pour continuer l'exécution du script à un autre point du programme. La cible est spécifiée par une étiquette sensible à la casse, suivi de deux-point, et l'instruction goto est ensuite suivie de ce label. goto n'est pas totalement sans limitations. L'étiquette cible doit être dans le même contexte et fichier, ce qui signifie qu'il n'est pas possible de changer de méthode ou de fonction, ni de se rendre dans une autre fonction. Il est de même impossible d'entrer dans une structure de boucle ou un switch. Il est néanmoins possible d'en sortir, et l'utilisation courante est alors de se servir de goto comme un break.

Exemple #1 Exemple avec goto

<?php

goto a;
echo
'Foo';

a:
echo
'Bar';

?>

L'exemple ci-dessus va afficher :

Bar

Exemple #2 Exemple de boucle avec goto

<?php
for ($i = 0, $j = 50; $i < 100; $i++) {
while (
$j--) {
if (
$j == 17) {
goto
end;
}
}
}
echo
"i = $i";
end:
echo
'j hit 17';

?>

L'exemple ci-dessus va afficher :

j hit 17

Exemple #3 Ce goto ne fonctionne pas

<?php
goto loop;
for (
$i = 0, $j = 50; $i < 100; $i++) {
while (
$j--) {
loop:
}
}
echo
"$i = $i";

?>

L'exemple ci-dessus va afficher :

Fatal error: 'goto' into loop or switch statement is disallowed in
script on line 2

add a note

User Contributed Notes 5 notes

up
56
Lollo
3 years ago
You should mention the label can't be a variable
up
33
devbyjesus at example dot com
2 years ago
the problem of goto is that it is a good feature but in a large codebase it reduces the readability of the code . that's all . i try to not use it to think about the person who is going to read after me .
up
5
georgy dot moshkin at techsponsor dot io
4 months ago
You can use goto to hide large HTML blocks without using echo():

<html><body>

<?php if ($hide_form_and_script) { goto label_1;} ?>

<form action="" method="post">
<!-- some HTML here -->
</form>
<script>
let a='test'; // no need to escape nested quotes as with echo()
// some JavaScript here
</script>

<?php label_1: ?>

</body></html>
up
8
BPI
2 years ago
You can jump inside the same switch. This can be usefull to jump to default
<?php
$x
=3;
switch(
$x){
case
0:
case
3:
print(
$x);
if(
$x)
goto
def;
case
5:
$x=6;
default:
def:
print(
$x);
}
?>
up
-3
Anonymous
1 year ago
Example to exit loops:

for ($i = 0; $i < 10; $i++) {
for ($j = 0; $j < 10; $j++) {
if ($condition) {
goto exit;
}
}
}
exit:
echo "Out of the loop.";
To Top