PHP nás při úrovni chyb E_NOTICE upozorňuje na práci s neinicializovanými proměnnými. Jsou s tím ale spojené dva problémy:
Napsal jsem proto program, který zdrojový kód zkontroluje, aniž by se kód musel spouštět. Původně jsem ho chtěl umístit na tento blog, ale poněkud se rozrostl, proto jsem pro něj vytvořil samostatný projekt. Program rozebere kód funkcí token_get_all a hledá v něm jakoukoliv práci s neinicializovanými proměnnými zhruba tímto algoritmem:
<?php $initialized = array(); $tokens = token_get_all($source); foreach ($tokens as $i => $token) { if ($token[0] === T_VARIABLE) { if ($tokens[$i+1] === '=') { $initialized[$token[1]] = true; } elseif (!$initialized[$token[1]]) { echo "Uninitialized variable $token[1] on line $token[2].\n"; } } } ?>
Jde samozřejmě o hrubé zjednodušení. Zohledňují se následující konstrukce:
Naopak některé konstrukce se kontrolují v rozporu s chováním jazyka:
${"a"}K poslednímu bodu – přestože je tento přístup především jednodušší, tak se jedná spíše o záměrnou vlastnost než nedostatek programu. Porovnejte následující dva kódy:
<?php if (auth()) { $auth = true; } else { $auth = false; } $auth = false; if (auth()) { $auth = true; } ?>
Přestože oba kódy proměnnou správně inicializují, tak je druhý kód lepší – pokud bych do prvního kódu doplnil nějakou další větev, tak se může stát, že na inicializaci v některém případě zapomenu.
Vyzkoušejte si, jestli správně inicializujete všechny proměnné. Pokud ano a program vám přesto tvrdí opak, dejte mi prosím vědět.