To be fair: If you are chaining ternary expressions, you deserve to suffer whatever pain the language happens to inflict upon you tenfold.
Why?
It’s perfectly readable.
It is sort of readable. A switch is “perfectly” readable for switching.
Ternary expressions aren’t switches though
Which is exactly why you shouldn’t be using them in a situation that clearly calls for a switch.
Sure, it’s counterintuitive, but so is not bracketing things in ternary operations.
You know that programmers of other languages don’t have to find excuses for their tool constantly, right?
You don’t know many languages, huh?
Hating on php is one of the reasons i left reddit. This is just people who don’t use php hating php for some reason. You can do dumb examples like this for any language. Low effort and funny for children.
Hey, I hate php AND javascript, and I’ve worked in both of them. :P
Your feelings are valid. I wonder though, would you put up this level of defense for posts making fun of arbitrary parts of non PHP languages?
You are not your favorite language. And I find most criticisms of most languages to be very valid. I don’t think the intent of OP is to insult all PHP programmers. It’s okay to like a language that has problems. All languages do.
I’d wager prevalence is part of their problem. Jokes get tired after a while, but that doesn’t always mean they stop.
PHP, like any language, has its problems, but it seems to get poked at a lot more often. But making the same joke over and over has been a problem long before reddit was a thing.
PHP Fatal error: Unparenthesized
a ? b : c ? d : e
is not supported. Use either(a ? b : c) ? d : e
ora ? b : (c ? d : e)
Ever wondered about the
array_fill
function? It can be baffling. Try filling an array with a negative index:array_fill(-5, 4, 'test');
Many languages would throw an error, but PHP? It’s perfectly fine with this and you get an array starting at index -5. It’s like PHP is the Wild West of array indexing!
Well, many languages are perfectly ok with negative array indexes.
But all of those languages are either statically typed ones where you declare the boundings with the array, or php.
Absolutely, many languages do allow negative indices. The intriguing part about PHP, though, is that its ‘arrays’ are actually ordered maps (or hash tables) under the hood. This structure allows for a broader range of keys, like our negative integers or even strings. It’s a unique design choice that sets PHP apart and allows for some really interesting usage patterns. Not your everyday array, right?
I’ve been working with PHP for two years now (not by choice) but I still sometimes forget the weird behaviours these not-arrays cause. Recently I was pushing/popping entries in a queue and it fucked the indexing. I had programmed it like I would any other sane language and it wasn’t until I was stepping through the bug I realised I had forgotten about this.
I hate PHP for so many more reasons. It baffles me why anyone would think it was a good idea to design it this way. Thankfully my current job involves actively burning it down and preparing for its replacement.
You think that’s bad, just wait until you hear what C does
Wat.
Ah, I understand now. The expression is evaluated like this:
$a == 1 ? "one" : $a == 2 ? "two" : $a == 3 ? "three" : "other"
$a == 2 ? "two" : $a == 3 ? "three" : "other"
"two" ? "three" : "other"
"three"
If you think PHP is weird, go look up ZZT-OOP, the scripting language from Tim Sweeney’s first game.
(No, a scripting language for game characters doesn’t need integers. If you need to count, you can do that by moving blocks around on the game board. It’s halfway between LOGO and Minecraft.)
I would expect this from Javascript :S
ZZT came out in 1991. JavaScript didn’t exist for at least four years after that.
Ah, I understand now. The expression is evaluated like this:
$a == 1 ? "one" : $a == 2 ? "two" : $a == 3 ? "three" : "other"
$a == 2 ? "two" : $a == 3 ? "three" : "other"
"two" ? "three" : "other"
"three"
Halp. I don’t understand how it went from step 2 to step 3.
It’s cause PHP associates the if-then-else pair only with its immediate “else” option, not with the entirety of the line.
Let’s go by parts.
$a == 1 ? "one" : $a == 2 ? "two" : $a == 3 ? "three" : "other"
Is $a equal to 1? If so, we’re “set” to the value on the left, which is
"one"
, if not then we’re set to the value on the right, which is$a == 2
. $a is not equal to 1, so we’re set to the right value,$a == 2
.This replaces the relevant part,
$a == 1 ? "one" : $a == 2
, with$a == 2
. So we’re left with:$a == 2 ? "two" : $a == 3 ? "three" : "other"
Next, is $a equal to 2? If so, we’re set to
"two"
, if not we’re set to$a == 3
. The comparison is true, so we’re set to the value on the left,"two"
. The relevant part here is$a == 2 ? "two" : $a == 3
only, so it replaces it with"two"
cause again, PHP is only associating with its immediate pair. So now we’re left with:"two" ? "three" : "other"
Finally, is
"two"
truthy? If so, we’re set to"three"
, if not we’re set to"other"
. Since"two"
is truthy we’re then left with"three"
.It’s super confusing for sure.
Thanks! I never worked with PHP but I understand your explanation. Making memes about languages is also about learning
Thank you for the great explanation, and for teaching me the word “truthy.”
Thank you!
[This comment has been deleted by an automated system]
Now do CGI.
Please. I worked with it for five years and I still don’t understand it.
I get hating on PHP is a meme, and the language certainly has faults, but I feel like it’s no more arbitrary than how JavaScript behaves. And just like JavaScript, if you follow modern standards and use a modern version, it’s a much better experience. The language is only as good as the programmer.
but I feel like it’s no more arbitrary than how JavaScript behaves
This is not the flex you think it is.
The fault is the programmer for not using a switch statement.
Finally got it…
$a == 1 ? "one" : ( ( $a == 2 ? "two" : $a == 3 ) ? "three" : "other" )