Coding horrors: Apparently 2 == "2abc"

This one is for the PHP enthusiasts, most of you are hopefully probably aware of this, but if you're not (and for people that adhere to other perhaps more sane languages), the following condition will evaluate to true and output the text, "How dodgy is this?"

 
if (2 == "2abc") {
	echo "How dodgy is this?";
}
 


The reason for this can be found in the way that PHP handles conversion/casting of its types. PHP will automatically convert the string ("2abc") to an integer to allow comparison of the values (the joys of loosely typeness).

Which brings me to the next expression which gives us a clue of what's really happening.

 
$a = (int) "2abc"; 
echo $a;
 


The non numeric part of the variable will be stripped away, leaving us with an integer value (if the string begins with a numeric value that is) - personally I believe this is horrible functionality - a variable containing non numeric values must NOT be allowed to be converted to an integer in this manner, conversion must fail.

Getting back to our if condition at the top, PHP introduced "identity" operators into their codebase in version 4 (I believe), observe:

 
if (2 === "2abc") {
	echo "How dodgy is this?";
}
 


This condition will evaluate to false and won't output anything, the reason being that instead of converting the variables we're attempting to compare, it compares the inferred types of each variable and only then the actual content of the variables.

In my opinion this is more credible (robust/safe) behaviour for an equality operator, not to mention to all the other operators in PHP that work in the same fashion (which might be too strict for a lot of PHP devs, something more familiar to strongly typed languages like C#).

One could argue that since PHP is a loosely typed language, one should rather implement some sane behaviour in the way PHP handles certain conversions and still allow PHP to convert values automatically to make them compareable.

This is exactly how javascript (another loosely typed language) handles scenarios like this. The following condition will evaluate to false like expected.

 
if (2 == "2abc")
{
	alert('True');
}
 


Unlike the identity operators in PHP, the following will evaluate to true, but since type conversion seems to be more sane in javascript, it doesn't matter, they might not be equal in type, but they are definitely equal in value.

 
if (2 == "2")
{
	alert('True');
}
 


Post/View comments
 

Guinea pigs needed

In the mood for some adventure?

I am currently doing some interesting development regarding web application frameworks.

I need some guinea pigs to test drive these products (PHP & .net) in the real world, if anyone's interested, contact me.





Post/View comments
 
First 16 17 18 19 20 21 22 23 24 25 Last / 42 Pages (83 Entries)

Latest Posts

Top 5 posts

Simple WYSIWYG Editor


Creating a WYSIWYG textbox for your website is actually quite simple.
2007-02-01 12:00:00

Moving items between listboxes in ASP.net/PHP example


Move items between two listboxes in ASP.net(C#, VB.NET) and PHP
2008-06-12 17:07:43

Cross Browser Issues: Firefox Word Wrapping


Firefox word wrapping issues
2008-06-09 09:51:21

Populate a TreeView Control C#


Populate a TreeView control in a windows application.
2009-08-27 16:01:03

What time will bring



2007-02-22 12:00:00