While I have made my career over the last decade mostly based on PHP programming, its weird and sometimes outright insane gotcha’s still get me on a regular basis.
Today, I came right up against one with what I thought should be a relatively simple piece of coding, something I’ve done thousands of times before. Checking if a value is in an array.
<?php
// simplified version of what I was working with
$myArray = array(0, 'First String', 'Second String');
if (in_array('Third String', $myArray)) {
$var = 'asc';
} else {
$var = 'desc';
}
// code above produces:
// $var = 'asc'
Every time I ran through the above block of code, the value of $var
was always asc
no matter the contents of the array.
Checking the value of the in_array
call always returned true
And do you know why in_array always returned true (even when it shouldn’t)…
PHP equates 0 to any string
<?php
var_dump(0 == 'any string you like'); // => true
How’s that for nice sane behaviour!
Update:
Well it appears this is actually a feature of the language.
Who am I to say what equality should be
Directly from the horses mouth on php.net
String to number conversion: If the string starts with valid numeric data, this will be the value used. Otherwise, the value will be 0 (zero)
Oh, and a quick search shows up lots of bug reports about this feature so I’m not the only one, but they are all closed as “Not A Bug”
This is one of the many reasons why I get so fed up with PHP and so excited to work with other langauges. While most languages have their own quirks, none (at least so far) seem to have quite the same range and quantity as PHP.