Remember if you are not a fan of wild labels hanging around you are free to use braces in this construct creating a slightly cleaner look. Labels also are always executed and do not need to be called to have their associated code block ran. A purposeless example is below.
<?php
$headers = Array('subject', 'bcc', 'to', 'cc', 'date', 'sender');
$position = 0;
hIterator: {
$c = 0;
echo $headers[$position] . PHP_EOL;
cIterator: {
echo ' ' . $headers[$position][$c] . PHP_EOL;
if(!isset($headers[$position][++$c])) {
goto cIteratorExit;
}
goto cIterator;
}
cIteratorExit: {
if(isset($headers[++$position])) {
goto hIterator;
}
}
}
?>
goto
(PHP 5 >= 5.3.0)
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 un label, 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. Vous pouvez sortir d'une fonction, 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
Note:
L'opérateur goto est disponible depuis PHP 5.3.
You are also allowed to jump backwards with a goto statement. To run a block of goto as one block is as follows:
example has a prefix of iw_ to keep label groups structured and an extra underscore to do a backwards goto.
Note the `iw_end_gt` to get out of the labels area
<?php
$link = true;
if ( $link ) goto iw_link_begin;
if(false) iw__link_begin:
if ( $link ) goto iw_link_text;
if(false) iw__link_text:
if ( $link ) goto iw_link_end;
if(false) iw__link_end:
goto iw_end_gt;
if (false) iw_link_begin:
echo '<a href="#">';
goto iw__link_begin;
if (false) iw_link_text:
echo 'Sample Text';
goto iw__link_text;
if (false) iw_link_end:
echo '</a>';
goto iw__link_end;
iw_end_gt:
?>
The goto operator CAN be evaluated with eval, provided the label is in the eval'd code:
<?php
a: eval("goto a;"); // undefined label 'a'
eval("a: goto a;"); // works
?>
It's because PHP does not consider the eval'd code, containing the label, to be in the same "file" as the goto statement.
You cannot implement a Fortran-style "computed GOTO" in PHP because the label cannot be a variable. See: http://en.wikipedia.org/wiki/Considered_harmful
<?php // RAY_goto.php
error_reporting(E_ALL);
// DEMONSTRATE THAT THE GOTO LABEL IS CASE-SENSITIVE
goto a;
echo 'Foo';
a: echo 'Bar';
goto A;
echo 'Foo';
A: echo 'Baz';
// CAN THE GOTO LABEL BE A VARIABLE?
$a = 'abc';
goto $a; // NOPE: PARSE ERROR
echo 'Foo';
abc: echo 'Boom';
?>
In a challenge of myself for a college class I decided to use the goto to remove all while loops from my code. It was actually easy, and AS FAST as While loops.
<?PHP
$start = microtime(true);
$i = 0;
StartOfLoop:
$i++;
if($i < 1000000) goto StartOfLoop;
echo microtime(true) - $start.PHP_EOL;
$start = microtime(true);
$i = 0;
while($i < 1000000){
$i++;
}
echo microtime(true) - $start.PHP_EOL;
?>
since label executes all the time even if you don't use goto label;
<?php
if (false)
goto label
label :
echo "label triggered";
?>
Will output: label triggered
I use labels like this
<?php
...some code...
if (false) {
label1 :
echo "label 1 triggered";
}
if (false) {
label2 :
echo "label 2 triggered";
}
if (false) {
label3 :
echo "label 3 triggered";
}
?>
It will never output unless you use "goto <label>".
