Autor Zpráva
fnevim
Profil *
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
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 *
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
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
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)
a
!array_key_exists('foo', get_defined_vars())
První způsob je samozřejmě rychlejší.
vrtakcz
Profil
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;
zabírá v paměti místo (je inicializovaná).
fnevim
Profil *
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
[#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
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
aha, pak je ta funkce ale zbytečná, ne? stačí porovnávat expr === NULL, ne?

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0