3 ms·
You can use the @ symbol to suppress errors when you're aware that the variable may be empty and you've considered the possible effects. When I used to write P
by steve-howard 15y ago
You can use the @ symbol to suppress errors when you're aware that the variable may be empty and you've considered the possible effects. When I used to write PHP, I'd often write something like
do_something(@$_GET['foobar']);
There are ways to suppress PHP notices without just turning off the E_NOTICE output.
- samdalton 15y agoIt shouldn't be ok to write code that is known to throw an error, and handle it by suppressing that error. Silently failing code is just a bug waiting to happen. It's also making the interpreter do unnecessary error handling work when a simple "if ($_GET['foobar'])" would suffice.
- philjackson 15y agoIt should be ok (the poor PHP implementation aside). Auto-vivification is something that's very useful in Perl and I miss it greatly in the languages I program in now. Being able to do this: $one->{ two }->{ three } = [ $four ] Without having to check every link for definedness makes for cleaner code, IMO. Making it optional "suppressing that error" would be a good middle-ground. Coffeescipt has the existential operator, not quite on a par with Perl's autovivification, which allows: zip = lottery.drawWinner?().address?.zipcode
- samdalton 15y agoThe Coffeescript ? operator is certainly quite handy. I suppose it's explicit nature is what helps, as information on the error you're trying to mask is built into the syntax. With @ in PHP however, you simply don't know what it's trying to stop, and what undesirable affects it may cause, which I think is the main objection to it.
- code_duck 15y agoIt's inefficient to do that, as from what I understand PHP actually sets the error level to none, processes that line, sets it back, and continues. Also it would suppress any other warnings from that line, which could be unrelated to the supplied argument value. Instead, I use a 'get or else' function, as in some functional languages. For arrays, it goes function get_or_else($array,$key,$default=null) { return isset($array[$key]) ? $array[$key] : $default; } This avoids any warnings, and also allows you to specify a default.
- steve-howard 15y agoI wasn't aware of that implementation detail. Hey, now I respect PHP even less than I did before. Your solution makes for some good boilerplate, but things like that are exactly why I use Python for everything it makes sense for: these things are baked into the language (in Python it would be array.get(key, default) ).
- code_duck 15y agoYeah, it's part of Scala's type system, too - (Option, and Some or None. Better language designers go to great lengths to make simple things like null values well covered). Python will throw a fatal error and exits on reference to a nonexistent Dictionary key, but PHP blithely fills in the value with something falsy and continues. I'd rather be using Python too, but for some apps we have to work with a lot of PHP legacy code, so I do what I can.
- steve-howard 15y agoTo be fair, Python doesn't throw a fatal error. It throws an Exception, which most people know to handle. The idiom is use a try/except block, but if you're clever you can usually avoid the need. Scala borrows the option types from SML (or, at least, SML has them and is much older). I love SML for its strict semantics (if something passes through the type system it most likely works as expected), but sadly design really doesn't inform platform choice (case in point: C++ is still common. I don't hate it as much as some people do, but it can't be said to be particularly well designed).