goto

The goto operator can be used to jump to another
section in the program. The target point is specified by a 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.

User Contributed Notes 11 notes

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.

However hated, goto is useful. When we say "useful" we don't mean "it should be used all the time" but that there are certain situations when it comes in handy.

There are times when you need a logical structure like this:<?php// ...do {

$answer = checkFirstSource(); if(seemsGood($answer)) break;

$answer = readFromAnotherSource(); if(seemsGood($answer)) break;

// ...

}while(0);$answer = applyFinalTouches($answer);return $answer;?>

In this case, you certainly implemented a goto with a "fake loop pattern". It could be a lot more readable with a goto; unless, of course, you hate it. But the logic is clear: try everything you can to get $answer, and whenever it seems good (e.g. not empty), jump happily to the point where you format it and give it back to the caller. It's a proper implementation of a simple fallback mechanism.

Basically, the fight against goto is just a side effect of a misleading article many decades ago. Those monsters are gone now. Feel free to use it when you know what you're doing.

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.