Niet helemaal waar, $_SESSION['username'] (de key "username" in het superglobale $_SESSION array) kan best bestaan, maar isset levert toch false op ingeval de waarde hiervan gelijk is aan NULL (misschien is !empty() dan een betere check?).
Inderdaad. Overigens is dit een designfout (een van de vele) in PHP. isset() zou true moeten teruggeven als de variabele is geset, maar de waarde NULL heeft. Vaak maakt dat niet zoveel verschil, bijvoorbeeld als je de waarde probeert te printen, maar er zijn situaties waarin je verschil zou willen kunnen maken tussen "niet geset" en "wel geset, maar met waarde NULL". Met empty() of is_null() kun je dat ook niet ondervangen.
De enige manier die ik kan bedenken is om via get_defined_vars() te kijken of er een variabele met de betreffende naam is gedefinieerd, maar dat vind ik best wel een paardenmiddel. En omslachtig. En enigszins off-topic in dit draadje. ;-)
Als het een array betreft volstaat array_key_exists() ook prima (ook in termen van performance). Je kunt jezelf i.i.g. een hoop ellende besparen door in eerste instantie het gebruik van NULL zoveel mogelijk te vermijden :).
Ook off-topic:
- isset() geeft bij mij altijd een beetje "code smell": alsof je niet zeker weet of een var (of key) al bestaat, en het dan maar "voorzichtig probeert".
- null vind ik een prima waarde. Ik initialiseer altijd alle properties expliciet op null (ondanks dat dat impliciet al gebeurt). Bij een getter is het dan ook:
public function getVar(){
if($this->_var === null) $this->_var = $this->whatever(); //maar dan dus geen null retourneren; hooguit false
return $this->_var;
}
Beide "voorkeuren" zullen wel voorkomen uit het feit dat ik ooit in Pascal ben begonnen (strong typed).
Nog meer offtopic:
Misschien niet een heel sterk voorbeeld, maar "zelfs" het gebruik van @ is soms geoorloofd. Dit als je verwacht dat er dingen fout kunnen gaan en meldingen wilt onderdrukken, maar deze moet je dan ook ondervangen uiteraard. Iets soortgelijks geldt voor isset(), dit is niet per definitie "fout" of "not done" - uit het gebruik moet blijken of dit een gezond iets is. En als je beweegredenen goed zijn, maakt het eigenlijk niet uit hoe je iets aanpakt, implementatie is ondergeschikt aan motivatie.
Je kunt beter een slechte (maar werkende) implementatie hebben van een goed idee dan een goede implementatie van een slecht idee, aan het eerste kun je altijd nog schaven :p.
Ik wist helemaal niet dat isset bij een null waarde false zal geven. Het is eigenlijk enigzins teleurstellend. (Over designfouten gesproken) Wel fijn om dit nu te weten. Ik kan dan naar array_key_exist uitwijken. Bedankt voor jullie inspirerende teksten :-)