четверг, 18 октября 2007 г.

String to int voodoo

Интересное поведение PHP: для людей писавших на нормальных языках это поведение сносит крышу:

<?
echo "<pre>";
echo (int)("all"==true)."\n"; // 1
echo (int)("all"==false)."\n"; // 0
echo (int)(1==true)."\n"; // 1
echo (int)(0==true)."\n"; // 0
echo (int)("all"==1)."\n"; // 0
echo (int)("all"==0)."\n"; // 1
echo "</pre>";
?>


А всё потому, что PHP при общении между строками и int приводит строки as is. То есть:
<?
echo "<pre>";
echo (int)"all"."\n"; // 0
echo (int)"123"."\n"; // 123
echo (int)"0123"."\n"; // 123
echo (int)"0xff"."\n"; //0
echo (int)"8sd"."\n"; // 8
echo "</pre>";
?>


Но! Тут уже начинает сносить крышу у меня:
<?
echo "<pre>";
echo (int)("0xff"==0)."\n"; // 0
echo (int)((int)"0xff"==0)."\n"; // 1
echo (int)("0xff"==255)."\n"; // 1
echo "</pre>";
?>


Это обьяснить и понять уже сложнее.

4 коммент.:

Mejedi комментирует...

Я предполагаю баг в пхп. Похоже "0xff" в контексте, где оно неявно приводится к целому числу преобразуется правильно (т.е. проверяется не только основание 10, но и 16). А при явном преобразовании через (int) проверяется только основание 10, причем если написан какой-то бред типа "123BrainFuck" не распарсенный хвост игнорируется и получается 123. По этой логике (int)"0xff" это действительно 0.

Luf комментирует...

Ну вообщем то... Да. Так и есть :)

Mejedi комментирует...

Замечание про нормальные языки меня порадовало :) Тебе сейчас нравится C#, да?

Luf комментирует...

В том числе. Мне вообще нравятся морфы Си - 99, плюсы, шарп. Я в курсе что языки разные, но ... Мне импонирует разносторонняя мощность плюсов, лаконичность и скорость 99, удобство шарпа.