[PHP] vreemde uitkomst switch

Pagina: 1
Acties:
  • 1.199 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • TwoR
  • Registratie: Augustus 2002
  • Laatst online: 12-08 16:48

TwoR

Gekleurde stippen

Topicstarter
Ik heb een vreemd 'probleem' in een switch die ik niet snap.

Ik heb de volgende code:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    switch(strtolower($this->wozo->medeaanvrager->get("geslacht")))
                        {
                            
                            case "vrouw":
                            case "0":
                            case 0:
                                $geslacht = 0;
                                break;
                            
                            case "man":
                            case "1":
                            case 1:
                                $geslacht = 1;
                                break;
                        }


Als ik als input in "$this->wozo->medeaanvrager->get("geslacht")" man heb staan komt er toch $geslacht = 0 uit.

Heeft iemand enig idee hoe dit kan? Als ik case 0 weghaal komt er wel het verwachte resultaat ($geslacht = 1) uit.

[ Voor 5% gewijzigd door TwoR op 23-10-2007 12:29 ]


Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Wat returned "$this->wozo->medeaanvrager->get("geslacht")" ? Dat is niet echt duidelijk!

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 11-08 18:05

Janoz

Moderator Devschuur®

!litemod

Welkom in de wondere wereld van php's dynamic type juggling ;).

Geslacht wordt 0 omdat php vindt dat "eenstring"==0 geldt.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
strtolower geeft een string terug, dus je hoeft helemaal niet op integers 0 en 1 te kijken. Verder is het debuggen wat er gebeurt ook redelijk straightforward: gewoon bij elke case een echo neerzetten.

{signature}


Acties:
  • 0 Henk 'm!

  • OxiMoron
  • Registratie: November 2001
  • Laatst online: 08-07 14:27
var_dump is your friend.

Albert Einstein: A question that sometime drives me hazy: Am I or are the others crazy?


Acties:
  • 0 Henk 'm!

  • TwoR
  • Registratie: Augustus 2002
  • Laatst online: 12-08 16:48

TwoR

Gekleurde stippen

Topicstarter
Voutloos schreef op dinsdag 23 oktober 2007 @ 12:42:
strtolower geeft een string terug, dus je hoeft helemaal niet op integers 0 en 1 te kijken. Verder is het debuggen wat er gebeurt ook redelijk straightforward: gewoon bij elke case een echo neerzetten.
Ik weet ook wel hoe ik kan debuggen, ik snap alleen niet dat PHP het op deze manier doet.
Snake schreef op dinsdag 23 oktober 2007 @ 12:36:
Wat returned "$this->wozo->medeaanvrager->get("geslacht")" ? Dat is niet echt duidelijk!
hier staat in man
Janoz schreef op dinsdag 23 oktober 2007 @ 12:38:
Welkom in de wondere wereld van php's dynamic type juggling ;).

Geslacht wordt 0 omdat php vindt dat "eenstring"==0 geldt.
waarom is dat dan? dat slaat toch helemaal nergens op :S

Acties:
  • 0 Henk 'm!

  • disjfa
  • Registratie: April 2001
  • Laatst online: 03-07 14:47

disjfa

be

TwoR schreef op dinsdag 23 oktober 2007 @ 13:22:
[...]
waarom is dat dan? dat slaat toch helemaal nergens op :S
Wat is als integer een string. Onbekend. Wat in php door gaat voor 0 :)

disjfa - disj·fa (meneer)
disjfa.nl


Acties:
  • 0 Henk 'm!

  • eamelink
  • Registratie: Juni 2001
  • Niet online

eamelink

Droptikkels

TwoR schreef op dinsdag 23 oktober 2007 @ 13:22:
waarom is dat dan? dat slaat toch helemaal nergens op :S
Als je met == een string vergelijkt met een integer wordt de string naar een integer geconverteerd, en daarbij wordt min of meer gewoon gekeken of de string met een integer-achtig-iets begint. Zoja, wordt dat de int, zonee, wordt het 0.

PHP:
1
2
3
print (int) "hoi";    // 0
print (int) "hoi5";    // 0
print (int) "5hoi";    // 5


Wat je eigenlijk wilt is kijken of het type ook gelijk is, dan kan je beter === gebruiken :)

Acties:
  • 0 Henk 'm!

  • Osiris
  • Registratie: Januari 2000
  • Niet online
eamelink schreef op dinsdag 23 oktober 2007 @ 13:27:
[...]

Als je met == een string vergelijkt met een integer wordt de string naar een integer geconverteerd, en daarbij wordt min of meer gewoon gekeken of de string met een integer-achtig-iets begint. Zoja, wordt dat de int, zonee, wordt het 0.
Dit staat allemaal ook prima in de manual over String conversion to numbers. :)

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Janoz schreef op dinsdag 23 oktober 2007 @ 12:38:
Welkom in de wondere wereld van php's dynamic type juggling ;).

Geslacht wordt 0 omdat php vindt dat "eenstring"==0 geldt.
Het is aan de programmeur om zinnig gebruik te maken van de features van een taal.
Of je de taal zinnig vindt met zn features is een andere discussie natuurlijk (die ik nadrukkelijk niet weer wil voeren.)

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • TwoR
  • Registratie: Augustus 2002
  • Laatst online: 12-08 16:48

TwoR

Gekleurde stippen

Topicstarter
eamelink schreef op dinsdag 23 oktober 2007 @ 13:27:
[...]

Als je met == een string vergelijkt met een integer wordt de string naar een integer geconverteerd, en daarbij wordt min of meer gewoon gekeken of de string met een integer-achtig-iets begint. Zoja, wordt dat de int, zonee, wordt het 0.

PHP:
1
2
3
print (int) "hoi";    // 0
print (int) "hoi5";    // 0
print (int) "5hoi";    // 5


Wat je eigenlijk wilt is kijken of het type ook gelijk is, dan kan je beter === gebruiken :)
Inderdaad dat zou dan de oplossing zijn, maar hoe gebruik je dat in een switch statement?

Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

TwoR schreef op dinsdag 23 oktober 2007 @ 14:50:
Inderdaad dat zou dan de oplossing zijn, maar hoe gebruik je dat in een switch statement?
Als je weet dat je er een string in gooit dan moet er ook een string uitkomen. Echter als op de een of andere rare manier er ook een integer ingegooit kan worden dan zou ik die 0 in de case als string noteren, dan cast PHP het automagisch wel goed :)

Acties:
  • 0 Henk 'm!

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Even los van je vraag. Waarom zou je uberhaupt vergelijken met een integer, aangezien je switch een string oplevert?

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Acties:
  • 0 Henk 'm!

  • disjfa
  • Registratie: April 2001
  • Laatst online: 03-07 14:47

disjfa

be

TwoR schreef op dinsdag 23 oktober 2007 @ 14:50:
[...]
Inderdaad dat zou dan de oplossing zijn, maar hoe gebruik je dat in een switch statement?
Makkelijkste is niet 0 gebruiken. Maar 1 en 2.

Of zoals in je voorbeeld in $this->wozo->medeaanvrager->get("geslacht") "man" of "vrouw" zetten. En geen nummers gebruiken.

disjfa - disj·fa (meneer)
disjfa.nl


Acties:
  • 0 Henk 'm!

  • 418O2
  • Registratie: November 2001
  • Laatst online: 01:37
als er maar 2 dingen uit kunnen komen is een switch sowieso niet echt nodig

PHP:
1
2
3
4
if(strtolower($this->wozo->medeaanvrager->get("geslacht")) == 'vrouw') 
 $geslacht = 0;
else
 $geslacht = 1;

Acties:
  • 0 Henk 'm!

  • disjfa
  • Registratie: April 2001
  • Laatst online: 03-07 14:47

disjfa

be

418O2 schreef op dinsdag 23 oktober 2007 @ 14:57:
als er maar 2 dingen uit kunnen komen is een switch sowieso niet echt nodig
Dat vind ik alleen een beetje eng. Dat zou betekenen dat iedereen die geen geslacht invult of er gaat iets mis dan zijn het mannen.

disjfa - disj·fa (meneer)
disjfa.nl


Acties:
  • 0 Henk 'm!

  • 418O2
  • Registratie: November 2001
  • Laatst online: 01:37
Dat is wel weer waar. Als er iets mis gaat zouden het juist vrouwen moeten zijn.

Acties:
  • 0 Henk 'm!

  • TwoR
  • Registratie: Augustus 2002
  • Laatst online: 12-08 16:48

TwoR

Gekleurde stippen

Topicstarter
418O2 schreef op dinsdag 23 oktober 2007 @ 14:57:
als er maar 2 dingen uit kunnen komen is een switch sowieso niet echt nodig

PHP:
1
2
3
4
if(strtolower($this->wozo->medeaanvrager->get("geslacht")) == 'vrouw') 
 $geslacht = 0;
else
 $geslacht = 1;
Dat is niet waar als het geen vrouw is kan het ook nog onbekend zijn en moeten mensen worden gepushed om iets in tevullen.

Verder is het mogelijk dat er meerdere waardes in kunnen komen, is een samenkomst van meerdere systemen die uiteindelijk recht getrokken wordt door de users waarbij de nieuwe webapplicatie de geslachten als 0 en 1 opslaat

Acties:
  • 0 Henk 'm!

  • TwoR
  • Registratie: Augustus 2002
  • Laatst online: 12-08 16:48

TwoR

Gekleurde stippen

Topicstarter
BtM909 schreef op dinsdag 23 oktober 2007 @ 14:52:
Even los van je vraag. Waarom zou je uberhaupt vergelijken met een integer, aangezien je switch een string oplevert?
Ik weet in eerste instantie niet precies wat erin komt , in dit geval is het een string maar het is in de toekomst mogelijk ook een int.

En ik kwam dit tegen en het viel me op, vandaar de vraag hier, maar het is me nu duidelijk geworden


offtopic:
Dat had ook in 1 post gekunt

[ Voor 4% gewijzigd door TwoR op 23-10-2007 15:37 ]


Acties:
  • 0 Henk 'm!

  • disjfa
  • Registratie: April 2001
  • Laatst online: 03-07 14:47

disjfa

be

TwoR schreef op dinsdag 23 oktober 2007 @ 15:36:
[...]
Verder is het mogelijk dat er meerdere waardes in kunnen komen, is een samenkomst van meerdere systemen die uiteindelijk recht getrokken wordt door de users waarbij de nieuwe webapplicatie de geslachten als 0 en 1 opslaat
Dan zet je voor je switch alles om naar het juiste systeem. Als het een integer is check je op 0 of 1 en switch je naar man en vrouw.

Of zoals al eerder gemeld is, je zet het toch al om in je huidige switch naar een string.

disjfa - disj·fa (meneer)
disjfa.nl


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12-08 11:33

.oisyn

Moderator Devschuur®

Demotivational Speaker

Grijze Vos schreef op dinsdag 23 oktober 2007 @ 14:12:
[...]

Het is aan de programmeur om zinnig gebruik te maken van de features van een taal.
Of je de taal zinnig vindt met zn features is een andere discussie natuurlijk (die ik nadrukkelijk niet weer wil voeren.)
Ten eerste zegt Janoz niets over of dit slecht is of niet, hij zegt gewoon hoe het werkt. Dus in dat opzicht vind ik jouw reactie een beetje misplaatst - je reageert op iets wat er niet staat :).

Ten tweede wil ik daar wél op inhaken, dit is een duidelijk voorbeeld van waarom het gedrag van PHP op z'n zachtst gezegd raar is. Je hebt een switch-statement, met daarin enkele cases. Er is een case die perfect aan een van de mogelijke inputwaarden voldoet, namelijk "man". Toch besluit PHP om de 0 als beste match te kiezen, waarschijnlijk omdat die eerder komt. Dat is toch van de zotte? Je geeft helemaal geen 0, je geeft "man", en je hebt een case voor "man". Idd, met if statements kun je er nog omheen werken door === te gebruiken, maar met de switch heb je gewoon geen enkele keuze. De string converteren naar int met uitkomst 0 en dan vervolgens de buijbehorende case kiezen is onintuitief, onhandig, en gewoon raar.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
.oisyn schreef op dinsdag 23 oktober 2007 @ 16:15:
[...]

Ten eerste zegt Janoz niets over of dit slecht is of niet, hij zegt gewoon hoe het werkt. Dus in dat opzicht vind ik jouw reactie een beetje misplaatst - je reageert op iets wat er niet staat :).
Mwoah, misschien lees ik een sarcastische ondertoon die jij niet leest, mgoed.
Ten tweede wil ik daar wél op inhaken, dit is een duidelijk voorbeeld van waarom het gedrag van PHP op z'n zachtst gezegd raar is. Je hebt een switch-statement, met daarin enkele cases. Er is een case die perfect aan een van de mogelijke inputwaarden voldoet, namelijk "man". Toch besluit PHP om de 0 als beste match te kiezen, waarschijnlijk omdat die eerder komt. Dat is toch van de zotte? Je geeft helemaal geen 0, je geeft "man", en je hebt een case voor "man". Idd, met if statements kun je er nog omheen werken door === te gebruiken, maar met de switch heb je gewoon geen enkele keuze. De string converteren naar int met uitkomst 0 en dan vervolgens de buijbehorende case kiezen is onintuitief, onhandig, en gewoon raar.
Oh is dat zo raar? Vind ik eigenlijk best logisch. Neem het volgende voorbeeld:

code:
1
2
3
4
5
6
switch(2)
{
  case 2: echo "3"; break;
  case 1: echo "1"; break;
  case 2: echo "2"; break;
}

Ik ken weinig talen die hier niet de eerste case evalueren en hem goedkeuren en dus gewoon 3 echoen. En dit is gewoon precies hetzelfde als de TS's voorbeeld. Een switch statement kent gewoon niet zoiets als specificiteit, die switch lijst wordt gewoon omgezet in een leuke branch structuur in machinetaal, maar dat weet je zelf ook wel.

"man" wordt vergeleken met 0, en het komt overeen, want (int) "man" == 0. Het enige dat je eigenlijk kan claimen is dat niet het switch argument gecast moet worden maar dat de case argumenten gecast moeten worden indien nodig, daar wil ik nog evt wel in meegaan.

Het is gewoon een handige feature dat je switches kunt definieren op strings, maar dan moet je ze wel gewoon "netjes" gebruiken, en niet je argument types gaan mixen, dan voorkom je dit soort problemen.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12-08 11:33

.oisyn

Moderator Devschuur®

Demotivational Speaker

Grijze Vos schreef op dinsdag 23 oktober 2007 @ 18:06:
[...]

Mwoah, misschien lees ik een sarcastische ondertoon die jij niet leest, mgoed.


[...]

Oh is dat zo raar? Vind ik eigenlijk best logisch. Neem het volgende voorbeeld:

code:
1
2
3
4
5
6
switch(2)
{
  case 2: echo "3"; break;
  case 1: echo "1"; break;
  case 2: echo "2"; break;
}

Ik ken weinig talen die hier niet de eerste case evalueren en hem goedkeuren en dus gewoon 3 echoen.
'Alleen maar' C, C++, Java en C# , die allemaal een foutmelding geven omdat de case 2 dubbel is. De volgorde voor controle maakt niet uit - logisch ook, omdat alle voorgenoemde talen (muv C#) ook aan fallthrough doen. Het is dus noodzaak om de cases zo te ordenen dat ze op functionaliteit gegroepeerd worden - en niet in welke volgorde ze gecontroleerd worden (die volgorde maakt bovendien niet uit omdat elke case uniek moet zijn).

Aangezien PHP z'n syntax leent van deze talen is het op z'n zachtst gezegd vreemd dat deze een vergelijkbare constructie op een compleet andere manier toepast. PHP kent óók fallthrough bij switches.

[ Voor 13% gewijzigd door .oisyn op 23-10-2007 18:27 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Ik ben niet zo bekend (als jij) met de inner workings van die talen, maar wat doen ze als je bijvoorbeeld 1+1 in een case zet. Zien ze dat die expressie gelijk is aan 2? Ik neem aan van wel dan.

M'goed, je zegt het zelf al, die dwingen af dat alle cases uniek zijn, iets wat PHP als interpreted taal niet doet (wat wel zou mogen, en zou moeten kunnen overigens). Maar dat is dan ook precies wat de TS fout doet, hij geeft niet distincte cases door zowel "man" als 0 te gebruiken, die gecast naar int gewoon hetzelfde zijn.

Ik blijf dus bij mijn punt, case statements op strings zijn leuk, maar gebruik het dan alleen maar voor strings, en niet voor strings en integers door elkaar, want een switch statement doet type insensitive matching.

[edit]
Je kunt PHP's gedrag raar noemen, je kunt het ook een gevolg van weak dynamic typing noemen.

[ Voor 6% gewijzigd door Grijze Vos op 23-10-2007 21:27 ]

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12-08 11:33

.oisyn

Moderator Devschuur®

Demotivational Speaker

Grijze Vos schreef op dinsdag 23 oktober 2007 @ 21:26:
Ik ben niet zo bekend (als jij) met de inner workings van die talen, maar wat doen ze als je bijvoorbeeld 1+1 in een case zet. Zien ze dat die expressie gelijk is aan 2? Ik neem aan van wel dan.
Ze verwachten allemaal compile-time constants, en ja, 1+1 is een compile-time constant, en dus gelijk aan 2 :)
M'goed, je zegt het zelf al, die dwingen af dat alle cases uniek zijn, iets wat PHP als interpreted taal niet doet (wat wel zou mogen, en zou moeten kunnen overigens). Maar dat is dan ook precies wat de TS fout doet, hij geeft niet distincte cases door zowel "man" als 0 te gebruiken, die gecast naar int gewoon hetzelfde zijn.
Mja, in mijn opzicht moet de beste match gekozen worden. Bij een if kan dat natuurlijk niet, maar bij een switch typisch juist wel. En zeker omdat je in de switch niet de mogelijkheid hebt om exacte types te vergelijken zoals je dat met de === operator kan doen.
Ik blijf dus bij mijn punt, case statements op strings zijn leuk, maar gebruik het dan alleen maar voor strings, en niet voor strings en integers door elkaar, want een switch statement doet type insensitive matching.
Dat is een punt waar ik het helemaal mee eens ben, maar dat punt is een gevolg van een (in mijn ogen) design flaw in de taal :). En daar moet je idd mee leren werken, dus door bijv. geen types te mixen in een switch.
Je kunt PHP's gedrag raar noemen, je kunt het ook een gevolg van weak dynamic typing noemen.
Dat zou je kunnen doen, maar dat is het gewoon niet. Het is niet zo dat dit een logisch gevolg is van weak dynamic typing. Het is een keuze om "bla"==0 true te laten zijn. Mijn eigen scripttaal heeft ook weak dynamic typing, toch levert een dergelijke expressie false op, omdat "bla" geen geldig getal is. Die keuze van PHP is in mijn ogen een foute keuze, eentje waar beginners keer op keer weer over struikelen. En ik kan er ook geen goed argument bij verzinnen - het komt puur voort uit het feit dat het wat simpeler te implementeren is (oh, een van de twee types is een int, dan converteer ik de andere ook naar int, of dat nou kan of niet, en doe dan pas de compare). Luiheid dus.

[ Voor 6% gewijzigd door .oisyn op 23-10-2007 21:55 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

Verwijderd

418O2 schreef op dinsdag 23 oktober 2007 @ 14:57:
als er maar 2 dingen uit kunnen komen is een switch sowieso niet echt nodig

PHP:
1
2
3
4
if(strtolower($this->wozo->medeaanvrager->get("geslacht")) == 'vrouw') 
 $geslacht = 0;
else
 $geslacht = 1;
dit is dus een voorbeeld van een bad practice. neem hier geen voorbeeld aan wat vroeg of laat breekt het. dit had natuurlijk moeten zijn:
PHP:
1
2
3
4
5
6
7
8
9
$compare = strtolower($this->wozo->medeaanvrager->get("geslacht"));
if($compare === 'vrouw'){ 
 $geslacht = 0;
}elseif($compare === 'man'){
 $geslacht = 1;
}else{
  trigger_error("Mislukt om uw geslacht te identificeeren.", E_USER_WARNING);
 return false;
}


aan de TS(en andere):
verder moet je nooit mixen met meerder types in switches. eigenlijk moet je nooit meerdere types mixen in welk loose compare-statement dan ook. een switch statement is zo'n statement.

hier wat links uit de PHP manual:
http://nl3.php.net/manual/en/control-structures.switch.php
http://nl3.php.net/manual....operators.comparison.php
http://nl3.php.net/manual...#types.comparisions-loose
http://nl3.php.net/manual...e.types.string.conversion

uit de manual wordt duidelijk dat een switch statement loose-comparison doet dus het switch statement uit de TS had ook kunnen worden geschreven als:
PHP:
1
2
3
4
5
6
7
$compare = strtolower($this->wozo->medeaanvrager->get("geslacht"));
$compare_as_int = (int) $compare);
 if(($compare === "vrouw") OR ($compare === "0") OR ($compare_as_int === 0)){
  $geslacht = 0;
 }elseif(($compare === "man") OR ($compare === "1") OR ($compare_as_int === 1)){
  $geslacht = 1;
 }

en dan wordt al snel duidelijk wat er mis gaat. als 1 van de 3 compare's klopt wordt het geslacht gezet waarbij eerst beide operands worden geconverteerd naar het zelfde type en vervolgens vergeleken.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12-08 11:33

.oisyn

Moderator Devschuur®

Demotivational Speaker

Je bedoelt == ipv ===. Als ie daadwerkelijk === deed bestond het hele probleem niet.

.edit: oh ik miste die $compare_as_int.

[ Voor 20% gewijzigd door .oisyn op 23-10-2007 22:17 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

Verwijderd

nee, want na de conversie wordt gewoon een strict comparison gedaan geloof ik. niet dat dan nog uitmaakt want als beide operands van het zelfde type zijn dan is == gelijk aan ===. bij == wordt de conversie eerst uitgevoerd en dan pas de vergelijking.

als ik == had geschreven dan had er nog een extra cast plaatsgevonden. === verbied deze extra cast.

Acties:
  • 0 Henk 'm!

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

Aardige verbetering, maar is de daadwerkelijke verbetering die hier plaats moet vinden niet het verwijderen van het gebruik van magic numbers/strings? Je code breekt namelijk op vele plekken als je de waarde voor $geslacht op 1 plek veranderd voor man bijvoorbeeld.

Ook is in dit gedeelte van de code is te zien dat "vrouw" $geslacht == 0 impliceert. Iets verderop in je code is dit natuurlijk niet meer duidelijk eventueel (i.e. de semantiek ontbreekt bij $geslacht). Constanten zouden uitkomst kunnen bieden, maar het probleem met dit is dat ze een waarde hebben en je situaties kan hebben waarbij je b.v. MAN = 0, VROUW = 0, ergo MAN == VROUW zou hebben. Natuurlijk is dit het ideaal van de echte wereld, maar in je business logics niet ;)

Enums zijn hiervoor bedacht, i.e. de waarde van de enum is zichzelf, en zouden hier een betere oplossing voor zijn (maar die heeft PHP afaik niet standaard in de taal. Je zou het op kunnen lossen door met objecten en hun referenties te werken.), en anders een predicaat, e.g. isMan($geslacht) wat true zou opleveren als het een man betreft en false als het een vrouw betreft.

[ Voor 5% gewijzigd door prototype op 23-10-2007 22:48 ]


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Mja, of de TS er goed aan doet om op drie verschillende manieren een geslacht aan te duiden is weer een ander vraagstuk, ik denk dat het ook het handigst is om dat te beperken tot of gewoon strings die je in de DB als enums opslaat, of constants definieren in de code en die in de DB opslaan als integers.

Overigens, volgens mij kennen de systemen van instanties meer dan 3 typen geslachten.

Allerminst man/vrouw/onbekend, maar ook rare zooi als "eerst man nu vrouw" en omgekeerd, hebben ze wel aardige termen voor geloof ik. Maar het staat allemaal genoteerd als het goed is.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 11-08 18:05

Janoz

Moderator Devschuur®

!litemod

Klopt. Er is in HL7 (dacht ik) een speciale geslachts code tabel. Deze wordt in de software in de hele medische wereld gebruikt. Volgens mij waren het er een stuk of 7, maar welke het waren weet ik niet meer exact. Ik kom er maar tot 6:
- man
- vrouw
- eerst man nu vrouw
- eerst vrouw nu man
- onbekend
- ongedefinieerd

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12-08 11:33

.oisyn

Moderator Devschuur®

Demotivational Speaker

Hermafrodiet?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

ISO 5218 hanteert vier waarden: M, F, O, X (Male, Female, unknown, unspecified).

(Dit als random bit of possibly useful, but mostly useless, information.)

[ Voor 34% gewijzigd door Confusion op 24-10-2007 13:26 ]

Wie trösten wir uns, die Mörder aller Mörder?


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Dat is idd de 7e.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info

Pagina: 1