return null of false

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ozzie PHP

Ozzie PHP

21/02/2013 17:20:51
Quote Anchor link
Kort vraagje...

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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
public function getAge() {
  if (isset($this->age)) {
    return $this->age;
  }
else {
    return false;
  }
}

?>


of

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
public function getAge() {
  if (isset($this->age)) {
    return $this->age;
  }
else {
    return null;
  }
}

?>
 
PHP hulp

PHP hulp

04/12/2024 09:32:24
 
Kris Peeters

Kris Peeters

21/02/2013 17:30:51
Quote Anchor link
Wel, het lijkt me interessanter om dan te kijken naar hoe je die functie gebruikt, eerder dan de functie binnen de class zelf te bekijken*.

stel dat je het zet in zo'n situatie:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
if ($age = $user->getAge()) {
...
}

?>


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.
 
Ozzie PHP

Ozzie PHP

21/02/2013 17:55:11
Quote Anchor link
Ik snap wat je bedoelt Kris. Goed punt.

Maar stel nu dat je deze constructie zou gebruiken...

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
$age
= $user->getAge();
// en je zou hier nu de controle gaan doen... en age blijkt niet te bestaan
// wat is dan mooier, dit:

if (is_null($age)) echo 'Leeftijd ontbreekt!';
// of
if ($age === false) echo 'Leeftijd ontbreekt!';
?>

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?
 
Kris Peeters

Kris Peeters

21/02/2013 18:00:08
Quote Anchor link
False. (zelfde redenering als die van jou)

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.
 
Ozzie PHP

Ozzie PHP

21/02/2013 18:27:45
Quote Anchor link
Oké thanks...

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.
 
Erwin H

Erwin H

21/02/2013 19:23:27
Quote Anchor link
En wat nu als false gewoon een legitieme waarde kan zijn voor die variabele....?
 
Ozzie PHP

Ozzie PHP

21/02/2013 20:23:28
Quote Anchor link
Hmmm... lijkt me vreemd als iemand geen leeftijd heeft ;)
 
- Mark -

- Mark -

21/02/2013 20:26:33
Quote Anchor link
Ongeboren?
 
Ozzie PHP

Ozzie PHP

21/02/2013 20:30:31
Quote Anchor link
ah ja natuurlijk... een ongeboren user... daar had ik nog niet aangedacht...

:-s

Afbeelding
 
- Mark -

- Mark -

21/02/2013 20:36:05
Quote Anchor link
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.
 
Wouter J

Wouter J

21/02/2013 22:20:08
Quote Anchor link
Je moet je allereerst afvragen of je uberhaupt wel controles wilt gaan doen. Moet je niet in een getter gewoon de property teruggeven die gegeven wordt? Dan zie je vanzelf wel of het is ingevult of niet.

En dan zou ik met leeftijden de default value op 0 zetten van die property.
 
Ozzie PHP

Ozzie PHP

21/02/2013 22:25:50
Quote Anchor link
Leeftijd was hier slechts een voorbeeld.

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.
 
Erwin H

Erwin H

22/02/2013 08:36:14
Quote Anchor link
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?
 
Ward van der Put
Moderator

Ward van der Put

22/02/2013 08:55:37
Quote Anchor link
Bij een getter zou ik null gebruiken in de standaardbetekenis: er is geen waarde. Als je false gebruikt, sluit je het gebruik van booleaanse eigenschappen bij voorbaat uit. En daarmee gebruik je false in twee verschillende betekenissen en krijg je dubbelzinnigheid.

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
 
Erwin H

Erwin H

22/02/2013 09:16:11
Quote Anchor link
Uitstekend verhaal van Ward. Enige wat ik er aan zou willen toevoegen is dat je eventueel bij de getter een default waarde zou kunnen meegeven als de variabele niet bestaat.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
function get( $varname, $default = null ){

}

?>

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.
 
Kees Schepers

kees Schepers

22/02/2013 09:19:38
Quote Anchor link
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.
 
Kris Peeters

Kris Peeters

22/02/2013 10:08:24
Quote Anchor link
In de c-talen ook.
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
 
Ozzie PHP

Ozzie PHP

22/02/2013 10:57:50
Quote Anchor link
Heren, dank allemaal voor de uitgebreide uitleg! Dan lijkt me null toch de betere optie. Thanks!!!
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.