User Contributed Notes 14 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.

This function despite it's bad name is pretty useful and the most CPU effective in to control a flow of multiple cascading situations.Let's say you have some form set, but before it you need to perform a lot of checks on which form to show based upon user permissions or settings:<?php$user_info = ...; //something you get before from session, cookies, database...if($user_info != "already_set"){//Some setting need isn't yet doneloadForm("form1");}else{//OK, the set was done, so let's continueif($user_info != "some_other_thing"){//Another thing missing...loadForm("form2"); }else{//OK, the second part is done, let's do the third...if($user_info != "some_yet_another_thing"){//And yet another thing to setup...loadForm("form3"); }else{/* Guess you can see the picture now, it will be if(){ else if(){ else if(){ else....}}}}}}}} } }}?>