Logika a PHP
23.March 2005 (Wednesday)Pohádka o tom, jak jsou užitečné datové typy a proč není dobré konvertovat string na bool.
PHP je jedním z jazyků, který kašle na datové typy. Tedy ono na ně nekašle úplně, hluboko ve svých útrobách si dělá poznámky, jestli v proměnné je číslo, objekt nebo pole - dovolí vám ale s proměnnou zacházet jak chcete. Takže proměnné, která obsahuje řetězec, můžete příště přiřadit číslo nebo objekt a můžete ji vesele porovnat s jinou proměnnou, která obsahuje třeba pole. Pokud porovnáváte dvě proměnné různého typu, PHP provede automatickou konverzi, tak aby se daly porovnat. Je to trochu složitější, ale v mém případě se porovnával boolean a string. Tam je to jednoduché (relativně) - neprázdný řetězec je True, prázdný False (až na jednu výjimku, ale o tom až za chvilku). Kód používá databázi PostgreSQL, která má také datový typ boolean, ale hodnoty získané z databáze nejsou True/False, ale řetězce ‘t’ a ‘f’. Ten, kdo to takhle napsal, by potřeboval nakopat do … však vy víte kam. Těm bystřejším už asi došlo, že nejsnažší cesta jak se dostat do nervového sanatoria je na tohle zapomenout a porovnávat logické hodnoty z PHP a z databáze. Takže samozřejmě platí, že True == ‘t’. Bohužel také platí, že True == ‘f’, protože jak jsem psal výše, neprázdný string se vyhodnocuje jako True. Takhle blbá chyba mě stála 4 hodiny života… No a to nejlepší na tom je, že převod stringů na bool má jednu výjimku: string ‘0′ se převádí na False (pozor: ‘00′ už je opět True!!). Co vedlo autory k zanesení takového bordelu do PHP opravdu nevím.