"Retez" == 0 záludnosti PHP?

Sunday 19.8.2012 17:08:12, Jakuje

Kategorie: PHP

PHP je v zásadě příjemný jazyk na programování, ale i po mnoha letech, co v něm intenzivně pracuji, mě dokáže překvapit. Dne se mu to podařilo při porovnávání hodnot int a string.

Teď když na to koukám, jaký je to nesmysl a jak by něco takového ve slušně typovaném jazyce vůbec nemohlo vzniknout, tak se téměř stydím. Ale PHP je netypované.

Před pár dny jsem otevřel projekt, abych něco otestoval a našel select, který měl vybrané dvě volby, přestože do něj vstupovala jako vybraná pouze hodnota jedna. Celý systém formulářů, jejich vstupů a výstupů jsem prošel a stále nikde nic. Po minimalizaci poslední části kódu na

Zdrojový kód:
php > $z = 0;
php > $a = 'A';
php > var_dump($z,$a,$a==$z,$a === $z);
int(0)
string(1) "A"
bool(true)
bool(false)

mi bylo jasné odkud vítr vane. Porovnání řetězce s číslem není úplně košér. PHP se pokusí provést typové konverzi z řetězce na int, jejíž výsledkem je nula, která je nule rovna.

Zdrojový kód:
php > var_dump((int)$z);
int(0)

To je celé kouzlo. Někteří se tuto věc pokoušeli nahlásit jako BUG, ale není to chyba - e to vlastnost.

Diskuse:

:
:
:

 
    

Podbarvená pole označená hvězdičkou jsou povinná!