goto

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

What's the worse thing that could happen if you use goto?
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

<?php
goto a;
echo
'Foo';

a:
echo
'Bar';
?>

The above example will output:

Bar

Example #2 goto loop example

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

The above example will output:

j hit 17

Example #3 This will not work

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

The above example will output:

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

add a note

User Contributed Notes 6 notes

up
11
devbyjesus at example dot com
11 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 .
up
28
Lollo
2 years ago
You should mention the label can't be a variable
up
-1
BPI
3 months 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
-23
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.
*/
up
-9
firstbitrix at ya dot ru
10 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!";
    }
}
up
-47
instatiendaweb at gmail dot com
1 year ago
$array = array();
for ($i = 0; $i <= 10; (int)$array[] = $i, $i++);

var_dump($array );
$countarray = (count($array) - 2) ;

var_dump($countarray);

static $goto = 0;
/***************************************************************************************************/
b:

$array[$goto] = $array[$goto] * 2;

if ($goto <= $countarray){
    $goto++;
    goto b;
}else{
    goto a;}
a:
/***************************************************************************************************/
var_dump($array);
To Top