Tutorials
switch()
Handig om een serie if'jes te vervangen
Pagina 1
Basis
De functie switch() is erg handig zijn om een hele serie if'jes overzichtelijker te maken. Om maar met een voorbeeldje te beginnen, de volgende code:
<?
if ($i == 0) {
echo '$i is 0';
}
elseif ($i == 1) {
echo '$i is 1';
}
elseif ($i == 2) {
echo '$i is 2';
}
elseif ($i == 3) {
echo '$i is 3';
}
?>
Kan worden vervangen door:
<?
switch ($i) {
case 0:
echo '$i is 0';
break;
case 1:
echo '$i is 1';
break;
case 2:
echo '$i is 2';
break;
case 3:
echo '$i is 3';
break;
}
?>
De werking van de functie is heel logisch. Hij bekijkt de variabele $i en bij elke 'case' vergelijkt hij die. Komt $i overeen met de 'case' wordt die code uitegevoerd.
In het voorbeeld wordt ervan uitgegaan dat $i een integer is. Let wel op dat bij strings aanhalingstekens gebruikt worden:
<?
switch ($string) {
case 'aap':
echo '$string is aap';
break;
case 'noot':
echo '$string is noot';
break;
case 'mies':
echo '$string is mies';
break;
}
?>
Misschien overbodig, maar voor de volledigheid: De code hierboven is dus hetzelfde als:
<?
if ($string == 'aap') {
echo '$string is aap';
}
elseif ($string == 'noot') {
echo '$string is noot';
}
elseif ($string == 'mies') {
echo '$string is mies';
}
?>
<?
if ($i == 0) {
echo '$i is 0';
}
elseif ($i == 1) {
echo '$i is 1';
}
elseif ($i == 2) {
echo '$i is 2';
}
elseif ($i == 3) {
echo '$i is 3';
}
?>
Kan worden vervangen door:
<?
switch ($i) {
case 0:
echo '$i is 0';
break;
case 1:
echo '$i is 1';
break;
case 2:
echo '$i is 2';
break;
case 3:
echo '$i is 3';
break;
}
?>
De werking van de functie is heel logisch. Hij bekijkt de variabele $i en bij elke 'case' vergelijkt hij die. Komt $i overeen met de 'case' wordt die code uitegevoerd.
In het voorbeeld wordt ervan uitgegaan dat $i een integer is. Let wel op dat bij strings aanhalingstekens gebruikt worden:
<?
switch ($string) {
case 'aap':
echo '$string is aap';
break;
case 'noot':
echo '$string is noot';
break;
case 'mies':
echo '$string is mies';
break;
}
?>
Misschien overbodig, maar voor de volledigheid: De code hierboven is dus hetzelfde als:
<?
if ($string == 'aap') {
echo '$string is aap';
}
elseif ($string == 'noot') {
echo '$string is noot';
}
elseif ($string == 'mies') {
echo '$string is mies';
}
?>
Pagina 2
Default
Maar wat als je wil dat er in het geval dat geen van de vergelijkingen klopt toch iets gebeurt? Daarvoor is 'default' toegevoegd. Dit is eigenlijk zo'n beetje hetzelfde als de 'else' bij een if:
<?
if ($i == 0) {
echo '$i is 0';
}
elseif ($i == 1) {
echo '$i is 1';
}
elseif ($i == 2) {
echo '$i is 2';
}
else {
echo '$i is niet 0, 1 of 2';
}
?>
Is gelijk aan:
<?
switch ($i) {
case 0:
echo '$i is 0';
break;
case 1:
echo '$i is 1';
break;
case 2:
echo '$i is 2';
break;
default:
echo '$i is niet 0, 1 of 2';
break;
}
?>
<?
if ($i == 0) {
echo '$i is 0';
}
elseif ($i == 1) {
echo '$i is 1';
}
elseif ($i == 2) {
echo '$i is 2';
}
else {
echo '$i is niet 0, 1 of 2';
}
?>
Is gelijk aan:
<?
switch ($i) {
case 0:
echo '$i is 0';
break;
case 1:
echo '$i is 1';
break;
case 2:
echo '$i is 2';
break;
default:
echo '$i is niet 0, 1 of 2';
break;
}
?>
Pagina 3
Break
Wat meer uitleg over de regel break; binnen een switch statement. Door break; te gebruiken breek je als het ware de switch af en gaat je verder met de rest van je code. Tot nu toe staat in de voorbeelden na elke 'case' een break; Het kan ook anders:
<?
switch ($i) {
case 0:
case 1:
echo '$i is 0 of 1';
break;
case 2:
echo '$i is 2';
break;
default:
echo '$i is niet 0, 1 of 2';
break;
}
?>
Dit voorbeeld is natuurlijk vrij simpel, maar het is ruimer te gebruiken.
Verder is het ook zo dat bij het de laatste 'case' de break; niet noodzakelijk is. Deze code:
<?
switch ($i) {
case 0:
case 1:
echo '$i is 0 of 1';
break;
case 2:
echo '$i is 2';
break;
default:
echo '$i is niet 0, 1 of 2';
}
?>
is ook goed. Ik vind het zelf netter om ook bij de laatste 'case' een break; te gebruiken.
<?
switch ($i) {
case 0:
case 1:
echo '$i is 0 of 1';
break;
case 2:
echo '$i is 2';
break;
default:
echo '$i is niet 0, 1 of 2';
break;
}
?>
Dit voorbeeld is natuurlijk vrij simpel, maar het is ruimer te gebruiken.
Verder is het ook zo dat bij het de laatste 'case' de break; niet noodzakelijk is. Deze code:
<?
switch ($i) {
case 0:
case 1:
echo '$i is 0 of 1';
break;
case 2:
echo '$i is 2';
break;
default:
echo '$i is niet 0, 1 of 2';
}
?>
is ook goed. Ik vind het zelf netter om ook bij de laatste 'case' een break; te gebruiken.
Pagina 4
Uitgebreide cases
In plaats van de simpele voorbeelden die genoemd zijn kunnen natuurlijk ook ingewikkeldere cases gebruikt worden. Op http://nl.php.net/switch vind je daarvan genoeg voorbeelden.
Een simpel voorbeeld:
<?
switch ($i) {
case 0:
echo '$i is 0';
break;
case 1:
echo '$i is 1';
break;
case $i > 1:
echo '$i is groter dan 1';
break;
default:
echo '$i is kleiner dan 0';
break;
}
?>
Maar ook (zelfgemaakte) functies kunnen binnen een switch gebruikt worden. Voorbeeld (uit de reacties op http://nl.php.net/switch):
<?
switch (func_num_args()) {
case 3:
$arg2 = func_get_arg(2);
case 2:
$arg1 = func_get_arg(1);
case 1:
$arg0 = func_get_arg(0);
break;
}
?>
Een simpel voorbeeld:
<?
switch ($i) {
case 0:
echo '$i is 0';
break;
case 1:
echo '$i is 1';
break;
case $i > 1:
echo '$i is groter dan 1';
break;
default:
echo '$i is kleiner dan 0';
break;
}
?>
Maar ook (zelfgemaakte) functies kunnen binnen een switch gebruikt worden. Voorbeeld (uit de reacties op http://nl.php.net/switch):
<?
switch (func_num_args()) {
case 3:
$arg2 = func_get_arg(2);
case 2:
$arg1 = func_get_arg(1);
case 1:
$arg0 = func_get_arg(0);
break;
}
?>
Pagina 5
Alternatieve syntax
In plaats van de normale syntax kan ook deze methode gebruikt worden:
<?
switch ($i):
case 0:
echo '$i is 0';
break;
case 1:
echo '$i is 1';
break;
case 2:
echo '$i is 2';
break;
default:
echo '$i is niet 0, 1 of 2';
break;
endswitch;
?>
<?
switch ($i):
case 0:
echo '$i is 0';
break;
case 1:
echo '$i is 1';
break;
case 2:
echo '$i is 2';
break;
default:
echo '$i is niet 0, 1 of 2';
break;
endswitch;
?>
Pagina 6
Het nut
En dan nog maar een veelgebruikte toepassing van de functie, zodat het een beetje duidelijk is waarom deze functie zo handig is.
<?
switch ($_GET['page']) {
case 'news':
include('news.php');
break;
case 'poll':
include('poll.php');
break;
case 'guestbook':
include('guestbook.php');
break;
case 'contact':
include('contact.php');
break;
default:
include('home.php');
break;
}
?>
Of om het korter te maken:
<?
switch ($_GET['page']) {
case 'news':
case 'poll':
case 'guestbook':
case 'contact':
include($_GET['page'].'.php');
break;
default:
include('home.php');
break;
}
?>
Nu zie je ook meteen waarom het handig kan zijn om de break; op het einde van een 'case' weg te laten.
<?
switch ($_GET['page']) {
case 'news':
include('news.php');
break;
case 'poll':
include('poll.php');
break;
case 'guestbook':
include('guestbook.php');
break;
case 'contact':
include('contact.php');
break;
default:
include('home.php');
break;
}
?>
Of om het korter te maken:
<?
switch ($_GET['page']) {
case 'news':
case 'poll':
case 'guestbook':
case 'contact':
include($_GET['page'].'.php');
break;
default:
include('home.php');
break;
}
?>
Nu zie je ook meteen waarom het handig kan zijn om de break; op het einde van een 'case' weg te laten.
Reacties
0