Thursday, December 31, 2009

Octal or not octal, that's the question

We know hexadecimal representations of numbers in code: 0x00 for example. A less well known number representation are octal numbers. Octal numbers are in C like languages defined by prefixing a number with a 0. This can result in weird bugs, especially when not knowing this format. Not-so-surprisingly PHP adds its special confusing powers to this feature.
     0815===0 = true
010===8 = true
"010"==10 = true
"010"==8 = false
"010"=="8" = false
"010"=="10" = true
"0xf"=="15" = true
"08"=="0" = false
018==1 = true
"01"==0 = false
"0xf"=="015" = true


Tested with:
<?
function test ($exp) {
echo sprintf("%15s = %s\n",$exp,eval("return ".$exp.";")?"true":"false");
}

test("0815===0");
test("010===8"); // true
test('"010"==10'); // true
test('"010"==8'); // false
test('"010"=="8"'); // false
test('"010"=="10"'); // true
test('"0xf"=="15"');
test('"08"=="0"');
test('018==1');
test('"01"==0');
test('"0xf"=="015"');

Tuesday, December 15, 2009

Just another type coercion thingie.

Check this out:
<?
var_dump(1 == "1 dog"); // true
var_dump(1 == "1 cat"); // true
var_dump("1 cat" == "1 dog"); // false

var_dump(1 == "0x1 dog"); // true
var_dump("1 dog" == "0x1 dog"); // false


Result:
bool(true)
bool(true)
bool(false)
bool(true)
bool(false)


Transitivity is none of the things that the "==" operator respects at all. Using the "===" comparator works (in this case). Yet I find this thing funny.
This thing refers to their project as "The key innovation in the 3.0 release is the introduction of the PHP-like Lua".

I would like to point out that this comparison is an awful insult to anyone who uses Lua. I can only assume that the author are not aware of what PHP is at all. Or Lua. Or both.

Friday, November 20, 2009

Identify yourself!

<?
$a = array(1,2,3);
$b = array(1,2,3);

var_dump($a === $b); // true;

$a[] = 4;

var_dump($a === $b); // false

Result:
bool(true)
bool(false)


In other words: You can't check if you have two variables that point to an array are in fact pointing to different arrays or if they are pointing to the same array.

Thursday, November 19, 2009

switch your case

<?
switch(0) {
case "text": var_dump("casejump"); break;
default: var_dump("default");
}


Output is:
casejump


This is so because 0 == "string" is always true because it converts the string to a number, which results in 0.

Tuesday, November 17, 2009

Java casting mayhem

Wanna cast a Double object to an Integer object? Not sure, but seems like this is the required casting:
(Integer)(int)(double)(Double)somedoubleobject

The (Integer) might be left away however. Well, most often.

foo()[0] doesn't work

<?

function foo () {
return new array(foo);
}

$arr = foo();
$arr[0](); // works
var_dump(foo()[0]); // compiling error

Doesn't work. Sucks.

Monday, November 16, 2009

'0x00' == '0'

<?
var_dump('0x00' == '0');
var_dump('0x0a' == '10');

will print out:


bool(true)
bool(true)

To emphasize: This is a string-string comparison. And the strings are anything but equal.

Friday, November 13, 2009

And != &&

<?

$a = 1;
$b = 0;

$c = $a and $b;
$d = $a && $b;

echo "'$c' != '$d' \n";


Outcome:

'1' != ''


Documented behavior. See http://www.php.net/manual/en/language.operators.precedence.php