return null of false
Stel je wil iets getten, maar die waarde bestaat niet.
Wat is dan mooier/het meest gebruikelijk om te returnen?
Is dat false of null?
Voorbeeld:
Code (php)
of
stel dat je het zet in zo'n situatie:
Dan lijkt een false mij het best.
Als je het rechtstreeks gebruikt in een string, verwacht php liefst een string, dus ''.
...
* eigenlijk vind ik dat bijna altijd. Of een class zinnig is, merk je pas als je voorbeelden ziet van hoe het je hem gebruikt.
Maar stel nu dat je deze constructie zou gebruiken...
Code (php)
Het gaat mij vooral om de betekenis van false en null.
Van de ene kant ben ik geneigd om false terug te geven, zo van... "onwaar" deze waarde bestaat niet. Maar van de andere kant zou je ook null terug kunnen geven, zo van... "leeg" ik ben een lege waarde.
Dus wanneer geef je null terug en wanneer false?
Je kan trouwens dit doen:
if (false === ($age = $user->getAge())) {
// en dan met $age verder doen
Ik vind return null vooral interessant wanneer een object verwacht wordt.
Mijn twijfel was dus vooral of het niet null (leeg) moet zijn, omdat je eigenlijk een lege waarde hebt. Vandaar dat ik het een beetje verwarrend vond/vind.
En wat nu als false gewoon een legitieme waarde kan zijn voor die variabele....?
Hmmm... lijkt me vreemd als iemand geen leeftijd heeft ;)
Ongeboren?
Sorry, ik had had niet gezien dat het om gebruikers ging. Ik was meer in de richting van een personage in een boek of film aan het denken.
En dan zou ik met leeftijden de default value op 0 zetten van die property.
In de praktijk gaat het om een waarde die je met een functie kunt getten, maar die niet altijd geset is. Ik kan de functie aanroepen, maar het zou kunnen dat de waarde helemaal niet bestaat. En dan wil ik dus false teruggeven.
Ozzie PHP op 21/02/2013 22:25:50:
Leeftijd was hier slechts een voorbeeld.
Hmm
Ozzie PHP op 21/02/2013 20:23:28:
Hmmm... lijkt me vreemd als iemand geen leeftijd heeft ;)
Deze opmerking sloeg dan dus nergens op. Ik herhaal mijn vraag, wat doe je bij een variabele waarbij false een legitieme waarde is?
Een geldige waarde gebruiken voor een onbekende waarde is niet altijd een goed idee: als een onbekende leeftijd gelijk is aan 0, slaat de administratie van een kinderdagverblijf op hol ;)
Het is een ontwerpbeslissing, maar misschien moet je niet twee verschillende taken in één methode stoppen. Daar heeft Wouter een punt: een getter get. Is de waarde kritiek, dan moet een get() niet ook de functie van een isset() vervullen. Bovendien moet je dan aan foutafhandeling doen en niet slechts een false retourneren waar minimaal een E_USER_NOTICE of een exception meer op zijn plaats is.
Laatste overweging is de werking van PHP zelf. Als je return aanroept zonder parameter, retourneert een methode null. En als je return helemaal weglaat, dan retourneert een methode ook null. Nog eens twee redenen om ook een getter bij het ontbreken van een waarde null te laten retourneren.
Gewijzigd op 22/02/2013 08:56:22 door Ward van der Put
Bestaat de variabele, dan krijg je gewoon de echte waarde mee, bestaat die niet, dan geef je de default mee, die default dan weer op null staat :-). Heb je bijvoorbeeld een integer nodig voor in een query, dan kan je er op deze manier voor zorgen dat je in elk geval altijd iets hebt waar je mee verder kan.
In Java, ben je verplicht vooraf te specificeren wat een functie terug geeft. Daar moet de functie dat ook echt terug geven of null. Dus in Java had false niet eens gewerkt, het moet dan een string of null zijn.
Dat is trouwens voor een groot deel een ding van memory alocation (toch vroeger; in c# speelt dat waarschijnlijk wat minder).
int mijn_functie() {
// definitie
return ...; // sowieso een int
}
a = mijn_functie();
Je wil van te voren exact weten hoe veel geheugen a zal nodig hebben.
Binnen een class:
Indien een methode een niet gesette waarde zou returnen, krijg je een fatal runtime error (als de compiler het al niet opgemerkt en tegengehouden heeft).
Gewijzigd op 22/02/2013 10:09:55 door Kris Peeters
Heren, dank allemaal voor de uitgebreide uitleg! Dan lijkt me null toch de betere optie. Thanks!!!