Dijkstra was pretty specific about the cases where goto would be confusing and made a case that one should would be better off just not using it at all. His argument applies much more to gotos that can jump across procedure boudaries. Most surviving gotos (including the PHP goto) are not that unconstrained so they do represent a compromise between Dijkstra's position and the pragmatic use of goto where it actually improves the readability of code - especially when exceptions are not available for some reason.
comefrom is an excellent and seriously useful instruction.
My team has (kind of) implemented it in hardware as a way of patching ROM code in RAM. When the PC becomes equal to an address in the comefrom table, the PC is loaded with a RAM address and execution continues there.
If you have a big chunk of code that could need small tweaks, storing it in ROM and implementing a small RAM alongside it saves a lot of chip area.
I'm almost 100% sure Freescale does this on some of their 32-bit microcontrollers.
Yes, I design ICs. No, I do not work for Freescale.
Finally, it is now possible to produce true spaghetti code in PHP.
I wonder why this took so long. To this date the oversight of omitting goto from a language that otherwise seemed so geared towards obfuscation puzzled me greatly.
So, to summarize, it's useful for people building certain projects with PHP and at the same time a great boon for people making sarcastic comments about PHP. Win win.
Comefrom could be usefull to implement aspect oriented semantics.
Invisible asserts are also possible for debugging purposes, that don't pollute the codebase. They also don't self-document the code but (and I might be mistaken) PHP can't just optimize some statements out so as to not have them eat cycles like compiled langs.
Both of these could sit in separate modules and be coupled in or not depending on weather one debugs or deploys.
What is the reasoning behind goto in PHP though? I know php well enough, and I can't think of a time or place I've ever said: "I really wish I had a goto here!"
If you have them in your language the common better solutions to those use cases include:
1. Labeled loop control
2. Exceptions
PHP has #2 and a bad form of #1. In PHP you get to say how many loops to break out of, but not the name of the loop to go to. This makes code less self-documenting and can be fragile when editing code.
Other uses of goto for which substitutes are harder to find are to to make your language a more convenient compilation target, and when interacting with other control structures not under your control. These uses are VERY rare. In a decade of professional Perl programming I have seen each used twice. None of the examples were in any code base I worked with. Two were in the Perl core, the first is that the s2p utility emits gotos to emulate branches in sed, and the second is that the original Switch.pm used a goto to break out of any loops that it happened to interact with. (That one was a computed goto! After all he didn't know how this switch might interact with other switches.)
I would be willing to use goto for nested loops in PHP, but only because PHP does not offer labeled loop control. While I like to believe that I understand when to use goto for other reasons, I doubt I'll ever encounter a serious need to do that in any language.
Third example: Writing a Python-style generator in a language that doesn't have it. There's a trivial rewrite using gotos that means you mostly get the same logic, but you need goto.
I think I've used that twice in 10 years, but when you need it, you need it. At the cost of uglying up one function you can clean up tens or hundreds of invocation points, each of which involves duplicate (and hard-to-factor-out without-this-trick) logic. (This is the trick to factoring it out.) I'll pay that gladly.
Break 3 is really unclear about where it's going to take you, especially if the code is poorly formatted, and doubly especially if you decide later that you want change the code and put another loop in it.
If you've ever been able to think of a time or a place that you've said "I really wish I had a goto here!", it might be time for a rewrite or a new job.
Though, admittedly, I don't think I've ever looked at a piece of code I've written that was more than six months old without thinking "who the hell did this and why did they want to torture me?"
Goto is pretty handy if you're not writing in the language but writing a translator to the language instead. That is, when some corporate politics demand the product must be in PHP but you feel you start losing your mind writing in it... well, write in your favorite language and compile it to PHP!
That is by far one of the worst solutions I've heard to the problem. I really feel bad for anyone who is hired to work on your code and told that it was written in PHP, only to look at a compiler generated mess.
If you are raising an error/exception, shouldn't you be doing that explicitly, instead of just outputting catch all error handling at the end of the routine?
Otherwise, we may as well just do: "on error resume next :-)"
This is C, in the kernel. You can't "raise an exception."
The gotos are necessary because kernel work requires allocating resources. If an error is hit, the function needs to exit, but it also needs to release its resources correctly. But, these resources need to be freed upon normal completion as well. Hence, gotos.
PHP is ubiquitous, and now I can be more easily targeted by languages that can compile to PHP. They must have had a use-case in mind when adding it, because it's a lot of work for nothing otherwise.
All of the standard 'structured programming' constructs (if, while, for, switch, etc.) are just wrappers around conditional jumps in nearly every imperative language. switch even uses labels for fuck's sake!
Control structures are high level abstractions around common patterns found with jumps and conditional branches. Many such patterns have been identified, ranging in complexity from simple loops and conditionals to non-local returns to cooperative multi-threading.
To assert that there is no possible good use for GOTO implies that every conceivable control flow pattern has a more clean and intuitive implementation using only the high level control structures.
When you consider the variation, from language to language, in the selection of control structures available, the conjecture seems absurd. At the very least, GOTO is a reasonable compromise when forced to use a language like C, which lacks structures for such common patterns as exceptions, among others.
What is certainly worse than using GOTO is contorting code to use high level control structures in counter-intuitive ways, or worse yet, implementing ad-hoc control mechanisms using conditional variables. For purposes of readability, an informatively labeled GOTO is greatly preferable to such obfuscation.
Fortunately, we have versatile languages like LISP and Ruby which provide a rich library of control flow abstractions and allow us to create our own using closures. For the rest of the world, let them have their GOTO.
It's kind of chuckle-worthy because it's being added in so late in the game, and because of the smart-ass bug report, but this is a non-issue.
In saying this, I take my life into my own hands, as you can now bet that I will be forced in the future to work on fixing some code written by someone that takes this new feature and runs with it.
I was under the impression that the addition of "goto" was a joke. Are people actually using it? While there are legitimate uses for "goto," they are pretty much isolated to low-level C code, and are made unnecessary in a language that supports exceptions...
Exceptions vs. goto-based cleanup is purely a matter of personal programming taste and habits. Gotos exist because there are people who find them convenient, and not because gotos are "legitimate" in the context of that particular programming language.
Making the language minimalistic is never a goal of a language design unless it's a Brainfuck. If it were a goal, there would've not been three loop constructs in any modern languages.
> 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.
but that doesn't quite imply that the label names don't need to be unique.
That would be quite typical for PHP, IMHO, with its global scope of top level variables (= not in a function) of old.
I am an avid PHP developer, and I can't believe this actually did get added into PHP5.3. Even when I was a total noob I never wished the language had a 'goto' feature. I don't understand why this needs to be in a scripting language.
I guess now it will be even easier to spot bad PHP code. That's the only plus I can think of.
Wait, wait, wait...GOTO in PHP is real?? I thought it was a joke when I heard about it a while back...
Those who use PHP properly don't need this, and the ones who currently write spaghetti....well, will now write even worse spaghetti! At least the good developers now have another way to spot bad code, I guess..
I can understand the use as a labeled jump for loops, that's handy. Are there other cases where this is useful? I'm thinking along the lines of things like Quercus.
When you're writing something that's modeled as a state machine, it's easier to use goto to jump between the states, rather than simulating it with a while loop, state variable, and case statement. Making the program's behavior conform to a flow chart would probably be about the same.
I wonder: would goto have a better reputation if flowcharts were used more often?
-- Erik Naggum, http://groups.google.com/group/comp.lang.lisp/msg/bb32931876...