Porovnávání v PHP

Pokud používáte PHP alespoň chvíli, určitě využíváte možností, jak zápis některých konstrukcí zjednodušit. Pokud například chceme něco vypsat pouze v případě prázdného pole, namísto zdlouhavého:

$arr = [];
if (count($arr)) {  
  echo 'not empty';
}

pravděpodobně napíšete pouze:

$arr = [];
if ($arr) {  
  echo 'not empty';
}

Důvod je zřejmý - psát méně kódu, který je pro ostatní čitelnější. V tomto případě je takovéto zjednodušení zápisu v pořádku. Obecně pokud váhám mezi dvěma zápisy téhož, vždy použiji ten, který bude na první pohled srozumitelnější. Není totiž nic lepšího, než když máte po někom upravovat kód, kterému je obtížné porozumět.

Tím se trochu oklikou dostávám k jádru věci. Dnes jsem narazil na zajímavou tabulku, která zobrazuje výsledky porovnání různých čísel, řetězců, booleovských hodnot a dalších.

Ve výše uvedeném případě je asi všem zřejmé, že následující kus kódu

var_dump([] == TRUE); // vypíše bool(false)  

vypíše FALSE. Co byste ale řekli že bude výsledkem nasledujících porovnání?

var_dump(0 == FALSE);  // TRUE  
var_dump(0 == "");     // TRUE  
var_dump(0 == "0");    // TRUE  
var_dump(0 == "php");  // TRUE  
var_dump(0 == "1");    // FALSE  

Vezmeme to postupně. První a druhý řádek je asi zřejmý, snad každý použil konstrukci if (0)... nebo if ("").... Na třetím řádku to vypadá, že PHP textovou reprezentaci nuly vyhodnotí jako integer a následně provede porovnání. Jenže pokud nulu porovnáme s jasně nečíselným textovým řetězcem "php", dostaneme také TRUE! Pokud by si někdo myslel, že porovnání s jakýmkoli řetězcem vrátí TRUE, ať se podívá na poslední řádek, platí totiž, že 0 != "1".

A porovnávat tomo můžeme skutečně hodně - v PHP většinou nepřemýšlíme nad tím, zda je v proměnné hodnota uložena jako string nebo jako integer. Na twitteru jsem narazil na tabulku, kde je zobrazeno vzájemné porovnání nejrůznějších hodnot, věřím, že si tam každý najde alespoň jedno překvapení.

A abyste nebyli překvapeni nad tím, jak se chová váš kód, doporučuji porovnávat tak, abyste byli schopni s jistotou říct, co bude výsledkem kterého porovnání. Ušetří to čas při následném hledání chyb a usnadní práci ostatním, kteří s vaším kódem budou pracovat. A to v konečném důsledku ušetří i váš čas, kdy byste zodpovídali otázky k mazaně napsanému kódu.

Tuto tabulku a další informace k tématu najdete v dokumentaci PHP.

Luděk Veselý

PHP Developer