Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

I'll admit, I loled.

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!"



Commonly cited use cases include:

    1. Break out of nested loops.
    2. Jump to cleanup code at the end of a function instead of an early return.
I never use goto, but I think the usual knee jerk reaction to it is sometimes unwarranted.


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.


There are better alternvatives for that:

  1. Many other languages use catch/throw or a more sophisticated version of break.
  2. This is often done with try/finally in other languages.
There is no excuse for re-introducing the goto command.


About (1), what's wrong with break? (it also accepts a level e.g. break 3)


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.

Please tell me you're joking.


I was joking. Sorry if it wasn't clear.



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.

You should probably read some of the code before saying it's bad. See, for example, the function that implements a memory map: http://miller.cs.wm.edu/lxr3.linux/http/source/mm/mmap.c?v=2...


Well, fair enough. My ignorance of C kernel programming is on display, but I'm pretty sure the topic was why we'd need goto's in PHP.

Again, I'm not seeing any specific need.


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.


The standard Acceptable Goto is used to throw control between levels of a multiply-nested loop.

See also: call/cc for managing control flow in a tangle of mutually recursive functions.


But it's not "a lot of work" to implement at all!

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!


I'll give you a point if you become more polite.


Seems like a legitimate bug submission to me.




Consider applying for YC's Summer 2026 batch! Applications are open till May 4

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: