The PHP Type System can Shoot you in the Leg
Recently i found a bug in our tests, where we compare 2 json files recursively value by value.
Even when the two json files were not the same, the tests returned true.
After debugging some time i found out the reason:
I will show you some examples:
in_array(0, array(18)); // FALSE
in_array(0, array('18')); // FALSE
in_array(0, array('Foo')); // TRUE
Why you get back TRUE in the last example?
The reason is the string-to-number conversions (http://php.net/manual/en/language.types.string.php#language.types.string.conversion). If we attempt to get a number from 'Foo', we get back 0.
echo intval('Foo'); // 0
To avoid this, provide the third paramter, true, placing the comparison in strict mode, which will not only compare values, but types as well:
in_array(0, array('Foo'), true); // FALSE
Written by Ralph Meier
Related protips
2 Responses
I don't think this is a bug. You are comparing a number.
It is like:
if( 0 == 'Foo' ) // it return TRUE
but if it was a string on both end:
if( '0' == 'Foo' ) // it return FALSE
Yes, it's not a bug in PHP, it's the defined type comparison behaviour. But our integration tests throwed back a wrong result, based on this missunderstanding of type comparison.