goto

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

Was ist das schlimmste, was passieren könnte, wenn man goto benutzt?
Bild von » xkcd

Der goto-Operator kann benutzt werden, um innerhalb eines Programs zu einer anderen Anweisung zu springen. Die Zielanweisung wird durch einen Zielnamen festgelegt, bei dem die Groß- und Kleinschreibung beachtet werden muss, gefolgt von einem Doppelpunkt, und der goto-Anweisung wird der entsprechende Zielname angefügt. Hierbei handelt es sich jedoch nicht um ein vollständig uneingeschränktes goto: Die Zielanweisung muss in der selben Datei und im selben Kontext liegen, d. h. dass weder aus einer Funktion oder Methode herausgesprungen werden kann, noch in sie hineingesprungen. Weiterhin kann nicht in eine Schleifen- oder switch-Anweisung hineingesprungen werden. Es ist jedoch möglich aus diesen herauszuspringen, weshalb goto häufig als Ersatz für ein mehrstufiges break verwendet wird.

Beispiel #1 goto-Beispiel

<?php
goto a;
echo
'Foo';

a:
echo
'Bar';
?>

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

Bar

Beispiel #2 goto Schleifenbeispiel

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

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

j hit 17

Beispiel #3 Das wird nicht funktionieren

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

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

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

add a note

User Contributed Notes 5 notes

up
36
Lollo
3 years ago
You should mention the label can't be a variable
up
17
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
1
BPI
1 year 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
-15
firstbitrix at ya dot ru
2 years 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
-34
PHP_is_still_great
3 years 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.
*/
To Top