In PHP, you can handle errors by calling or die to exit when you encounter certain errors, like this:
$handle = fopen($location, "r") or die("Couldn't get handle");
Using die() isn’t a great way to handle errors. I’d rather return an error code so the parent function can decide what to do, instead of just ending the script ungracefully and displaying the error to the user.
However, PHP shows an error when I try to replace or die with or return, like this:
$handle = fopen($location, "r") or return 0;
Why does or die() work, but not or return 0?
I want to thank you for asking this question, since I had no idea that you couldn’t perform an
or returnin PHP. I was as surprised as you when I tested it. This question gave me a good excuse to do some research and play around in PHP’s internals, which was actually quite fun. However, I’m not an expert on PHP’s internals, so the following is a layman’s view of the PHP internals, although I think it’s fairly accurate.or returndoesn’t work becausereturnisn’t considered an “expression” by the language parser – simple as that.The keyword
oris defined in the PHP language as a token calledT_LOGICAL_OR, and the only expression where it seems to be defined looks like this:Don’t worry about the bits in the braces – that just defines how the actual “or” logic is handled. What you’re left with is
expr T_LOGICAL_OR expr, which just says that it’s a valid expression to have an expression, followed by theT_LOGICAL_ORtoken, followed by another expression.An
expris also defined by the parser, as you would expect. It can either be ar_variable, which just means that it’s a variable that you’re allowed to read, or anexpr_without_variable, which is a fancy way of saying that an expression can be made of other expressions.You can do
or die()because the language constructdie(not a function!) and its aliasexitare both represented by the tokenT_EXIT, andT_EXITis considered a validexpr_without_variable, whereas thereturnstatement – tokenT_RETURN– is not.Now, why is
T_EXITconsidered an expression butT_RETURNis not? Honestly, I have no clue. Maybe it was just a design choice made just to allow theor die()construct that you’re asking about. The fact that it used to be so widely used – at least in things like tutorials, since I can’t speak to a large volume of production code – seems to imply that this may have been an intentional choice. You would have to ask the language developers to know for sure.With all of that said, this shouldn’t matter. While the
or die()construct seemed ubiquitous in tutorials (see above) a few years ago, it’s not really recommended, since it’s an example of “clever code”.or die()isn’t a construct of its own, but rather it’s a trick which uses – some might say abuses – two side-effects of theoroperator:or) is not executed if the first operand returnsTRUE, since if one operand isTRUEin anorexpression, then they both are.Some people consider this sort of trickery to be unfavourable, since it is harder for a programmer to read yet only saves a few characters of space in the source code. Since programmer time is expensive, and disk space is cheap, you can see why people don’t like this.
Instead, you should be explicit with your intent by expanding your code into a full-fledged
ifstatement:You can even do the variable assignment right in the
ifstatement. Some people still find this unreadable, but most people (myself included) disagree:One last thing: it is convention that returning
0as a status code indicates success, so you would probably want to return a different value to indicate that you couldn’t open the file.