[php] continue in een switch om conditie te her-evalueren

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • g4wx3
  • Registratie: April 2007
  • Laatst online: 02-07 00:59
als devvers zijn jullie wel bekend met switch case.
PHP:
1
2
3
4
switch($day){
    case 'monday': echo 'today is monday';break;
    case 'tuesday': echo 'today is tuesday';break;
}

kan soms handig zijn, zeker bij omgekeerd gebruik
PHP:
1
2
3
4
switch(true){
   case $day='monday': echo 'today is monday';break;
   case $day='teusday': echo 'today is tuesday';break;
}

maar ik wil ergens toe komen:
We gebruiken break; om uit te breken uit 'de lus' (zo vernoemd door php.net)
Ook kan je uit de lus breken met continue, praktisch is er geen verschil.

Zonder break; wordt alle code uitgevoerd na de eerste waar-conditie;
Zonder evalutie van de overige condities! Zelden handig, maar het kan.
Het zou handig zijn, om met continue aan te duiden, om opnieuw te evaluren!

PHP:
1
2
3
4
switch(null){
   case $foo: echo 'foo is null';continue;
   case $bar: echo 'bar is null';continue;
}


De FICTIEVE uitkomst van deze code zou zijn
code:
1
2
foo is null
bar is null


Lijkt mij toch handig, en implementeerbaar?
Zou het eventueel kunnen?
Wat denken jullie van deze nieuwe implementatie?

http://www.softfocus.be/


Acties:
  • 0 Henk 'm!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 19:07

Dido

heforshe

g4wx3 schreef op vrijdag 09 september 2016 @ 10:55:
Lijkt mij toch handig, en implementeerbaar?
Zou het eventueel kunnen?
Wat denken jullie van deze nieuwe implementatie?
Ik zie geen verschil met een IF, eerlijk gezegd.

Dus je gaat een switch nu net zo lang vernaggelen tot het een setje if-statements wordt.

Handig? IF statements zijn heel handig.
Implementeerbaar? Jazeker. IF is in heel veel talen geïmplementeerd.
Zou het kunnen? Als het implementeerbaar is, kan het.
Wat vind ik ervan? Misschien dat het voor PHP wat toevoegt.

Wat betekent mijn avatar?


Acties:
  • 0 Henk 'm!

  • LEDfan
  • Registratie: Juni 2012
  • Laatst online: 18:49
g4wx3 schreef op vrijdag 09 september 2016 @ 10:55:
als devvers zijn jullie wel bekend met switch case.
PHP:
1
2
3
4
switch($day){
    case 'monday': echo 'today is monday';break;
    case 'tuesday': echo 'today is tuesday';break;
}

kan soms handig zijn, zeker bij omgekeerd gebruik
PHP:
1
2
3
4
switch(true){
   case $day='monday': echo 'today is monday';break;
   case $day='teusday': echo 'today is tuesday';break;
}

maar ik wil ergens toe komen:
We gebruiken break; om uit te breken uit 'de lus' (zo vernoemd door php.net)
Ook kan je uit de lus breken met continue, praktisch is er geen verschil.

Zonder break; wordt alle code uitgevoerd na de eerste waar-conditie;
Zonder evalutie van de overige condities! Zelden handig, maar het kan.
Het zou handig zijn, om met continue aan te duiden, om opnieuw te evaluren!

PHP:
1
2
3
4
switch(null){
   case $foo: echo 'foo is null';continue;
   case $bar: echo 'bar is null';continue;
}


De FICTIEVE uitkomst van deze code zou zijn
code:
1
2
foo is null
bar is null


Lijkt mij toch handig, en implementeerbaar?
Zou het eventueel kunnen?
Wat denken jullie van deze nieuwe implementatie?
Sowieso gaat de implementatie ervan veranderen geen goed idee zijn IMO. Daarnaast een continue statement wordt gebruikt om binnen een loop de huidige iteratie te stoppen en naar de volgende te gaan. Een break statement wordt gebruikt om de volledige loop te stoppen. Aangezien er maar 1 iteratie is binnen een case statement lijken beide statements een redelijk logisch gedrag te hebben.

Trouwens de noodzaak van die break statements komt van de implementatie in assembly bij gecompileerde talen. Daar wordt afhankelijk van de waarde een adres berekend naar waar gesprongen moet worden. Vandaar dat het bij C en C++ ook enkel werkt met getallen. Ik ken de implementatie bij PHP niet maar daar lijkt me het eerder syntax sugar en geen performance wist te maken.

Acties:
  • 0 Henk 'm!

  • Tjolk
  • Registratie: Juni 2007
  • Laatst online: 15:44
continue en break doen effectief hetzelfde binnen een switch. Het enige voordeel van een continue is dat je uit een eventuele hogere loop kunt springen, bijvoorbeeld zo:
PHP:
1
2
3
4
5
6
7
8
9
10
<?php

while ($row = $result->mysq_fetch_assoc()) {
    switch($row['foo']) {
        case 'bar':
            continue(2);
    }
}
// je komt dan hier
?>

Maar eerlijk gezegd komt dit nogal fuzzy op mij over en zou ik ten behoeve van duidelijkheid van mijn code waarschijnlijk anders oplossen.

[ Voor 14% gewijzigd door Tjolk op 09-09-2016 11:14 ]

Tjolk is lekker. overal en altijd.


Acties:
  • 0 Henk 'm!

  • ThomasG
  • Registratie: Juni 2006
  • Laatst online: 06:40
LEDfan schreef op vrijdag 09 september 2016 @ 11:12:
[...]


Sowieso gaat de implementatie ervan veranderen geen goed idee zijn IMO. Daarnaast een continue statement wordt gebruikt om binnen een loop de huidige iteratie te stoppen en naar de volgende te gaan. Een break statement wordt gebruikt om de volledige loop te stoppen. Aangezien er maar 1 iteratie is binnen een case statement lijken beide statements een redelijk logisch gedrag te hebben.

Trouwens de noodzaak van die break statements komt van de implementatie in assembly bij gecompileerde talen. Daar wordt afhankelijk van de waarde een adres berekend naar waar gesprongen moet worden. Vandaar dat het bij C en C++ ook enkel werkt met getallen. Ik ken de implementatie bij PHP niet maar daar lijkt me het eerder syntax sugar en geen performance wist te maken.
Een switch heeft een break nodig, omdat het anders een fall-through heeft naar het volgende case statement. Ook in PHP. Stel je hebt de code:
PHP:
1
2
3
4
5
6
7
8
$foo = 'bar';
switch ($foo) {
case 'bar':
  print 'Hello, ';
case 'baz':
  print 'World!';
  break;
}
Dan krijg je gewoon: "Hello, world!" te zien, omdat het 'bar' case statement niet wordt afgesloten met een break.

Acties:
  • 0 Henk 'm!

  • DevWouter
  • Registratie: Februari 2016
  • Laatst online: 17:30

DevWouter

Creator of Todo2d.com

swich-cases voelen bij mij toch erg vaak aan als code-smell. Makkelijker vind ik een dictionary waarbij de value een verwijzing is naar een functie.

C#:
1
2
3
4
var lookup = new Dictionary<Type, Action<IExportProperty, SupplementInspector.PropertyOption>>();
lookup[typeof (int)] = HandleInt;
lookup[typeof (bool)] = HandleBool;
lookup[typeof (string)] = HandleString;


Het is overzichtelijker, makkelijker te unit-testen en je blijft kleine functies behouden. Helemaal omdat switch-cases weleens de neiging heb om te blijven groeien.

"Doubt—the concern that my views may not be entirely correct—is the true friend of wisdom and (along with empathy, to which it’s related) the greatest enemy of polarization." -- Václav Havel


Acties:
  • 0 Henk 'm!

  • wackmaniac
  • Registratie: Februari 2004
  • Laatst online: 09-07 10:11
Doe maar gewoon niet. Het komt ook de leesbaarheid/begrijpbaarheid van je code niet ten goede.

Read the code, write the code, be the code!


Acties:
  • +1 Henk 'm!

  • ThomasG
  • Registratie: Juni 2006
  • Laatst online: 06:40
DevWouter schreef op vrijdag 09 september 2016 @ 11:26:
swich-cases voelen bij mij toch erg vaak aan als code-smell. Makkelijker vind ik een dictionary waarbij de value een verwijzing is naar een functie.

C#:
1
2
3
4
var lookup = new Dictionary<Type, Action<IExportProperty, SupplementInspector.PropertyOption>>();
lookup[typeof (int)] = HandleInt;
lookup[typeof (bool)] = HandleBool;
lookup[typeof (string)] = HandleString;


Het is overzichtelijker, makkelijker te unit-testen en je blijft kleine functies behouden. Helemaal omdat switch-cases weleens de neiging heb om te blijven groeien.
Dat hangt maar net van de taal af. Switches hebben als voordeel dat ze een fall-through hebben, zodat je niet zelf hoeft te lussen bij afhankelijkheden. Daarbij, in talen als C++ hangt de gecompileerde code af van het aantal case statements. Heb je bijv. 3 case statements, dan wordt het gecompileerd als een if-statement. Heb je er bijvoorbeeld 15, dan wordt het ene lookup-table.

Switches hebben hun voordelen, vooral bij compiler optimalisaties. Je moet alleen geen switch statements gebruiken wanneer dat niet nodig is. Als je zelf een lexer schrijft in C++ is er bijvoorbeeld geen snellere manier dan een switch statement.

Acties:
  • 0 Henk 'm!

  • g4wx3
  • Registratie: April 2007
  • Laatst online: 02-07 00:59
Ger schreef op vrijdag 09 september 2016 @ 11:13:
continue en break doen effectief hetzelfde binnen een switch. Het enige voordeel van een continue is dat je uit een eventuele hogere loop kunt springen, bijvoorbeeld zo:
PHP:
1
2
3
4
5
6
7
8
9
10
<?php

while ($row = $result->mysq_fetch_assoc()) {
    switch($row['foo']) {
        case 'bar':
            continue(2);
    }
}
// je komt dan hier
?>

Maar eerlijk gezegd komt dit nogal fuzzy op mij over en zou ik ten behoeve van duidelijkheid van mijn code waarschijnlijk anders oplossen.
Dat kan toch ook met break 2;

break ondersteund ook een getal.

het alternatief, is een array met vars te vergelijk met de waarden, en dan een foreach, daarom dat een switch wel handig zou kunnen zijn, mocht deze anders reageren op een continue

http://www.softfocus.be/


Acties:
  • 0 Henk 'm!

  • Tjolk
  • Registratie: Juni 2007
  • Laatst online: 15:44
Mja, je hebt gelijk inderdaad. Even niet ver genoeg gedacht. Sterker nog: in de documentatie staat zelfs dat binnen een switch continue gelijkwaardig is aan een break

Tjolk is lekker. overal en altijd.


Acties:
  • 0 Henk 'm!

  • incaz
  • Registratie: Augustus 2012
  • Laatst online: 15-11-2022
g4wx3 schreef op vrijdag 09 september 2016 @ 10:55:
kan soms handig zijn, zeker bij omgekeerd gebruik
PHP:
1
2
3
4
switch(true){
   case $day='monday': echo 'today is monday';break;
   case $day='teusday': echo 'today is tuesday';break;
}
Sneu voor de Boomtown Rats

Eeuwig maandag, assignments in cases lijkt me niet goed.
Zonder evalutie van de overige condities! Zelden handig, maar het kan.
Het zou handig zijn, om met continue aan te duiden, om opnieuw te evaluren!
Hoewel ik je voorbeeld niet heel sterk vind, zou ik daar zeker mogelijkheden voor zien. Vooral als je een lijstje van stappen aan het afwerken bent, en je uitkomt op een set nested ifs (horror) of if( $still_true ) next_step() heb ik er ook wel vaak over gedacht.
Maar het lijkt me wel even puzzelen om de syntax goed te krijgen, want nu nog het default gedrag van cases te veranderen gaat vast niet goed...

Never explain with stupidity where malice is a better explanation


Acties:
  • 0 Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 04-06 11:57
g4wx3 schreef op vrijdag 09 september 2016 @ 10:55:
als devvers zijn jullie wel bekend met switch case.
PHP:
1
2
3
4
switch($day){
    case 'monday': echo 'today is monday';break;
    case 'tuesday': echo 'today is tuesday';break;
}

kan soms handig zijn, zeker bij omgekeerd gebruik
PHP:
1
2
3
4
switch(true){
   case $day='monday': echo 'today is monday';break;
   case $day='teusday': echo 'today is tuesday';break;
}

maar ik wil ergens toe komen:
We gebruiken break; om uit te breken uit 'de lus' (zo vernoemd door php.net)
Ook kan je uit de lus breken met continue, praktisch is er geen verschil.

Zonder break; wordt alle code uitgevoerd na de eerste waar-conditie;
Zonder evalutie van de overige condities! Zelden handig, maar het kan.
Het zou handig zijn, om met continue aan te duiden, om opnieuw te evaluren!

PHP:
1
2
3
4
switch(null){
   case $foo: echo 'foo is null';continue;
   case $bar: echo 'bar is null';continue;
}


De FICTIEVE uitkomst van deze code zou zijn
code:
1
2
foo is null
bar is null


Lijkt mij toch handig, en implementeerbaar?
Zou het eventueel kunnen?
Wat denken jullie van deze nieuwe implementatie?
Kijk eens naar een taal als Elixir. Daar kan je allemaal toffe dingen doen in een switch, die zijn case noemen. Elixir is bovendien veel toffer dan PHP.

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • +1 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 18:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

ThomasG schreef op vrijdag 09 september 2016 @ 11:33:
[...]
Dat hangt maar net van de taal af. Switches hebben als voordeel dat ze een fall-through hebben, zodat je niet zelf hoeft te lussen bij afhankelijkheden. Daarbij, in talen als C++ hangt de gecompileerde code af van het aantal case statements. Heb je bijv. 3 case statements, dan wordt het gecompileerd als een if-statement. Heb je er bijvoorbeeld 15, dan wordt het ene lookup-table.
Of het een lookup table wordt hangt nogal af van het domein van je cases. Daarnaast is dat natuurlijk absoluut niet gelimiteerd aan switch blokken, de meeste optimizers interpreteren een lijst van (else) if's precies hetzelfde als een switch.

Switch gebruiken als een optimalisatie-techniek lijkt me dan ook zinloos. De semantische betekenis is veel belangrijker: "ik heb een expressie, en ik wil nu voor de volgende verschillende uitkomsten verschillende dingen doen". Bij een lijst van (else) if's is die intentie veel minder duidelijk te zien, want je kunt natuurlijk zomaar ineens een ander soort expressie stoppen in een van de if's.



Als je, zoals in PHP mogelijk is, echter switcht op een constante en dan expressies in je case statements gaat stoppen, dan ben je gewoon idioot bezig. Ik zie dan ook helemaal niets in deze 'feature', die het schrijven van slechte code alleen maar promoot.

[ Voor 18% gewijzigd door .oisyn op 09-09-2016 12:21 ]

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.

Pagina: 1