3 ms·
if("0") {} being equivalent to if(false) {} still gives me nightmares even though I've stopped using PHP for at least 6 years now :)
by nasretdinov 5mo ago
if("0") {} being equivalent to if(false) {} still gives me nightmares even though I've stopped using PHP for at least 6 years now :)
- kif 5mo agoAlso `empty("0") === true` is a common gotcha.
- moritzwarhier 5mo agoI knew this in and out, but as a Full-Stack PHP/Symfony/Frontend/JS guy who pivoted to mainly TS for b2b stuff, I still have to occasionally enter !"" into the browser console just to be sure, during code reviews :D
- tredre3 5mo agoIn JS/TS: "0" == false : true "" == false : true " " == false : true "1" == false : false !"0" : false !"" : true !" " : false !"1" : false In PHP: "0" == false : true "" == false : true " " == false : true "1" == false : false !"0" : true !"" : true !" " : false !"1" : false Honestly the only way to remain sane in either, but especially if you use both, is to always use === and never use boolean logic (!) when a string could be involved.
- moritzwarhier 5mo agoThat's what I say in code reviews as well. Same for numbers. !someValue is useful only for: - booleans, including optional booleans (which is why every bool flag should default to false) - undefined, null (falsy), or object/function (truthy) It's nice for the second variant to also cover falsy NaN or things like this, for example for forms. I guess that's where !!""===false comes from. But it's this exact case that keeps tripping me up. What about empty arrays? Per my original comment, now I'd have to look up if ![] is false in PHP, or just empty([]) === true . So yea I agree, and extend your case to PHP "arrays" (in JS, !![] === true is true
- zerocrates 5mo agoObviously it depends what you're working on, what your patterns are, and so on. But my experience is that PHP involves so much array wrangling that devs are more likely to have a handle on what an array will do in this context (an empty array is falsy). It's the string ones (in particular that in addition to the empty string, "0" specifically is the only other falsy string) that tend to catch people out.
- user3939382 5mo agoIn what context are you doing if("0")? People always have these obscure type comparison complaints, not just for PHP, and all I can think is why would you write that?
- jorams 5mo agoSomething you'll see in real codebases is code that cares whether an input value is "empty", but it doesn't matter if it's null or an empty string. It's very easy to go for this: if ($input) {} It'll work through every test case you try, and then someone enters a 0 into the field and it's also unexpectedly considered empty.