Progamming languages that don’t do what you expect.

Try this:

<?php
$a1 = “0d2”;
$a2 = “0d3”;
$b1 = “0e2”;
$b2 = “0e3″;

if ($a1 == $a2) print ‘$a1 == $a2’.”n”;
if ($b1 == $b2) print ‘$b1 == $b2’.”n”;
// In fact
if (“0e2” == “0e3″) print ‘”0e2” == “0e3″‘.”n”;

// But
if ($a1 === $a2) print ‘$a1 === $a2’.”n”;
if ($b1 === $b2) print ‘$b1 === $b2’.”n”;
if (“0e2” === “0e3″) print ‘”0e2” === “0e3″‘.”n”;

// I can cope with this behaviour for ==, even though it is strange,
// as php.net says:
// “If you compare two numerical strings, they are compared as integers.”

// However, php.net says
// $a == $b Equal: TRUE if $a is equal to $b.
// $a === $b Identical: TRUE if $a is equal to $b,
// and they are of the same type.

// Demonstrably, whatever type php decides the first argument is,
// it should be the same as the second.
// So === should have the same behaviour as ==
// Agreed? 🙂
// The worry is that the temptation is to use ===,
// but I really think that strcmp is the only true way.
// There must be shedloads of programs out there
// which use == for strcmp on input,
// but would break if the input looked like a small double
// (in case you hadn’t worked out why yet!).
// I think I’ll change my name to “0e1″ 🙂

// And before you ask
if ($a1 != $a2) print ‘$a1 != $a2’.”n”;
if ($b1 != $b2) print ‘$b1 != $b2’.”n”;
if ($a1 !== $a2) print ‘$a1 !== $a2’.”n”;
if ($b1 !== $b2) print ‘$b1 !== $b2’.”n”;

// So at least it is consistent.
?>

Which gives:
$b1 == $b2
“0e2” == “0e3”
$a1 != $a2
$a1 !== $a2
$b1 !== $b2

Flattr this!