Autor | Zpráva | ||
---|---|---|---|
fnevim Profil * |
#1 · Zasláno: 19. 7. 2010, 01:39:27
Docela mě překvapilo, že isset vrací false pokud je proměnná nastavena, ale má hodnotu NULL. Jak se v php správně testuje existence proměnné? Dejme tomu nastavím proměnnou "pok" na NULL. Otestuju jí pomocí isset, ten vrátí false, pak ji otestuju pomocí is_null a ejhle už jsem doma. Sranda ale nastane, pokud není taková proměnná nastavena - pak isset vrátí false a is_null vyhodí NOTICE o neexistenci proměnné, pak by se dalo použít ještě @is_null, ale to je dost ohavné. Jak se to tedy správně ověřuje?
|
||
tiso Profil |
#2 · Zasláno: 19. 7. 2010, 02:20:37 · Upravil/a: tiso
fnevim: NULL sa používa pre neznámu hodnotu, a to false je správne, čo by si chcel s premennou nastavenou na NULL robiť?
edit: reálne situácia, ktorú testuješ nemôže nastať. Buď do premennej priradíš nejakú hodnotu (takže vždy existuje a môže mať hodnotu NULL), alebo nemusí existovať, ale nebude mať hodnotu NULL. |
||
fnevim Profil * |
#3 · Zasláno: 19. 7. 2010, 02:33:51
tiso:
„čo by si chcel s premennou nastavenou na NULL robiť?“ Provést na ní unset, pokud existuje. Konkrétně se jedná třeba o pole, ve kterém chci vymazat položku XY, kde si nejdříve budu ověřovat jestli XY v poli existuje (vím, že v tomhle případě by stačilo použít třeba in_array, zajímá mě ale i jestli není jiná možnost ověření existence). |
||
vrtakcz Profil |
#4 · Zasláno: 19. 7. 2010, 05:49:37 · Upravil/a: vrtakcz
Bohužel v PHP tohle u normální proměnné dosáhnout nejde. Na štěstí u pole se dá použít array_key_exists.
btw NULL je hodnota jako každá jiná jen má specifický význam (jedná se o PRÁZDNOU hodnotu). V PHP bohužel není jeji implementace dvakrát dobrá. |
||
Majkl578 Profil |
#5 · Zasláno: 19. 7. 2010, 06:31:29
S potřebou testovat existenci proměnné jsem se mockrát nesetkal, většinou jde o kontrolu hodnoty. Interpretace je ze zhruba taková, že proměnná s hodnotou NULL vypadá v isset/empty stejně jako neexistující proměnná.
Proměnná je považována nulovou když: - byla inicializována s hodnotou NULL - nebyla inicializována - byla odstraněna pomocí unset() / (unset)
Testovat přímo neexistenci proměnné lze nejjednodušeji dvěmi způsoby: !isset($foo) || is_null($foo) !array_key_exists('foo', get_defined_vars()) |
||
vrtakcz Profil |
#6 · Zasláno: 19. 7. 2010, 06:40:49 · Upravil/a: vrtakcz
Majkl578:
> Proměnná je považována nulovou když: > - byla inicializována s hodnotou NULL > - nebyla inicializována > - byla odstraněna pomocí unset() / (unset) Tady se ale neřeší zda je proměnná nulová ale zda je inicializovaná. Reálně totiž i $foo = NULL; |
||
fnevim Profil * |
#7 · Zasláno: 19. 7. 2010, 08:50:20
Majkl578:
> Testovat přímo neexistenci proměnné lze nejjednodušeji dvěmi způsoby: > > > !isset($foo) || is_null($foo) Zkus si to aniž bys proměnnou foo jakkoli inicializovat - pokud máš zaplé error all tak to vypíše NOTICE. |
||
AM_ Profil |
#8 · Zasláno: 19. 7. 2010, 10:33:22
[#7] fnevim
notice mám zapnuté a nic mi to nevypisuje. Majkl578: „!isset($foo) || is_null($foo)“ Tohle moc nedává smysl. je-li !isset($foo): - true, je OR vždy true; - false, znamená to, že $foo existuje a NENÍ null - is_null a tedy celý výraz je vždy false celý výraz je tedy ekvivalentní s !isset($foo). obávám se, že vzhledem k této divné implementaci NULL v PHP je is_null vlastně negace isset. Asi bych pro tyto případy přimhouřil oko nad zavináčem, nebo (chci unsetovat proměnnou $bagr pokud existuje): $bagr = null; //vytvořím/přepíšu původní obsah - mám jistotu, že následující unset nevyvolá notice unset($bagr); Ale fnevim: - měj na paměti, že PHP aplikace obvykle žije pár milisekund a pak zemře spolu se všemi proměnnými, takže nemá smysl sám řešit správu paměti, dokud ti opravdu neteče do bot - isset() je podle mě na místě jen u superglobálních polí (GET, POST, COOKIE, SESSION ...), ve kterých nevíš, co přišlo, a ty stejně není radno přepisovat... pokud se ti v půlce skriptu někdy objevuje nějaká jiná proměnná, u které nevíš, co je to zač, zavání to spíše špatným návrhem nebo kódem... |
||
Mastodont Profil |
#9 · Zasláno: 19. 7. 2010, 11:53:52 · Upravil/a: Mastodont
obávám se, že vzhledem k této divné implementaci NULL v PHP je is_null vlastně negace isset
To se obáváš správně a v manuálu je to i v komentářích zmíněno. Exiistuje ale další rozdíl: "is_null" tests if an *expression* (not a *variable*) is null, while "isset" tests if a *variable* has null value or is undefined <?php function test() { return null; } var_dump(is_null(test())); // displays "true" var_dump(isset(test())); // parse error, because "test()" is not a variable ?> |
||
AM_ Profil |
#10 · Zasláno: 19. 7. 2010, 12:09:15
aha, pak je ta funkce ale zbytečná, ne? stačí porovnávat expr === NULL, ne?
|
||
Časová prodleva: 15 let
|
0