[PHP 5 >= 5.3.0, PHP 7, PHP 8]
Image courtesy of » xkcd
The goto
operator can be used to jump to another section in the program. The target point is specified by a case-sensitive label followed by a colon, and the instruction is given as goto
followed by the desired target label. This is not a full unrestricted goto
. The target label must be
within the same file and context, meaning that you cannot jump out of a function or method, nor can you jump into one. You also cannot jump into any sort of loop or switch structure. You may jump out of these, and a common use is to use a goto
in place of a multi-level break
.
Example #1 goto
example
The above example will output:
Example #2 goto
loop
example
The above example will output:
Example #3 This will not work
The above example will output:
Fatal error: 'goto' into loop or switch statement is disallowed in script on line 2
devbyjesus at example dot com ¶
7 months 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 .
Lollo ¶
1 year ago
You should mention the label can't be a variable
firstbitrix at ya dot ru ¶
6 months ago
I found a good way to use goto for walking through a foreach iteration one another time in order not to walk through whole array once again or not to use special and mostly complex if...else constructions.
But don't forget to make an exit from the goto loop if the iteration of rewalking reaches to many attemptions.
Brief example:
foreach [$fooArray as $foo] {
$attemptionLimit = 0;
restartIteration:
if [++$attemptionLimit > 10] {
continue;
}
$result = $foo->doSomething[];
if [!$result] {
$foo->doSomethingElse[$attemptionLimit];
goto restartIteration;
} else {
echo "Done!";
}
}
PHP_is_still_great ¶
1 year ago
// goto is STILL a good feature if you know how to use it.
// Just don't use it in loops.
// Example:
$sql = "DELETE FROM sometable WHERE id=?;";
$stmt = $conn->prepare[$sql];
if [!$stmt] {
echo "ERR prepare_fail";
goto End;
}
$bind = $stmt->bind_param['i', $id];
if [!$bind] {
echo "ERR bind_fail";
goto End;
}
$exec = $stmt->execute[];
if [!$exec] {
echo "ERR exec_fail";
goto End;
}
if [isset[$_POST['file']]] {
$file = "../" . $_POST['file'];
if [is_file[$file]] { unlink[$file]; }
}
echo "OK delete_success" ;
End:
$stmt->close[];
$conn->close[];
exit;
/*
instead of repeating the $stmt->close[] and $conn->close[],
we save a few lines by adding a goto and just close everything at the end.
*/
instatiendaweb at gmail dot com ¶
1 year ago
$array = array[];
for [$i = 0; $i