Forum und email

switch

Η δήλωση switch είναι παρόμοια με μια σειρά από IF δηλώσεις πάνω στην ίδια έκφραση. Σε πολλές περιπτώσεις, ίσως θέλετε να συγκρίνετε την ίδια μεταβλητή (ή έκφραση) με πολλές διαφορετικές τιμές, και να εκτελέσετε ένα διαφορετικό κομμάτι κώδικα ανάλογα με την τιμή με την οποία ισούται η μεταβλητή σας. Αυτό ακριβώς κάνει η δήλωση switch.

Note: Σημειώστε ότι σε αντίθεση με μερικές γλώσσες, η δήλωση continue εφαρμόζεται στην switch και ενεργεί παρόμοια με την break. Αν έχετε μια switch μέσα σε ένα loop και θέλετε να συνεχίσετε στην επόμενη επανάληψη του εξωτερικού loop, χρησιμοποιείστε την continue 2.

Τα ακόλουθα δυο παραδείγματα είναι δυο διαφορετικοί τρόποι για να γράψετε το ίδιο πράγμα, ο ένας χρησιμοποιεί μια σειρά από δηλώσεις if, και ο άλλος χρησιμοποιεί τη δήλωση switch :

<?php
if ($i == 0) {
    print 
"i equals 0";
} elseif (
$i == 1) {
    print 
"i equals 1";
} elseif (
$i == 2) {
    print 
"i equals 2";
}

switch (
$i) {
    case 
0:
        print 
"i equals 0";
        break;
    case 
1:
        print 
"i equals 1";
        break;
    case 
2:
        print 
"i equals 2";
        break;
}
?>

Είναι σημαντικό να καταλάβετε πώς η δήλωση switch εκτελείται προκειμένου να αποφευχθούν λάθη. Η switch εκτελείται γραμμή-γραμμή (για την ακρίβεια, δήλωση - δήλωση). Αρχικά δεν εκτελείται κάποιος κώδικας. Μόνο όταν μια δήλωση case βρεθεί με τιμή που ταιριάζει την τιμή της switch έκφρασης, η PHP αρχίζει να εκτελεί τις δηλώσεις. Η PHP συνεχίζει να εκτελεί τις δηλώσεις μέχρι το τέλος του switch block, ή την πρώτη φορά που θα συναντήσει μια break δήωση. Αν δεν γράψετε μια break δήλωση στο τέλος της λίστας δηλώσεων της case, η PHP θα συνεχίσει να εκτελεί τις δηλώσεις της επόμενης case. Για παράδειγμα:

<?php
switch ($i) {
    case 
0:
        print 
"i equals 0";
    case 
1:
        print 
"i equals 1";
    case 
2:
        print 
"i equals 2";
}
?>

Εδώ, αν η $i ισούται με 0, η PHP θα εκτελέσει όλες τις εντολές print! Αν η $i ισούται με 1, η PHP θα εκτελέσει τις τελευταίες δύο εντολές print. Θα είχατε την αναμενόμενη συμπεριφορά ('η i ισούται με 2' θα εμφανιζόταν) μόνο αν η $i ισούται με 2. Συνεπώς, είναι σημαντικό να μην ξεχνάτε τις εντολές break (ακόμη και αν θέλετε να αποφύγετε να τις τοποθετήσετε από προθεση κάτω από ορισμένες συνθήκες).

Σε μια switch εντολή, η συνθήκη υπολογίζεται μόνο μια φορά και το αποτέλεσμα συγκρίνεται με κάθε case εντολή. Σε μια elseif εντολή, η συνθήκη υπολογίζεται ξανά. Αν η συνθήκη σας είναι πιο περίπλοκη από μια απλή σύγκριση και/ή είναι σε ένα στενό loop, μια switch ίσως είναι ταχύτερη.

Η λίστα των δηλώσεων για μια case μπορεί επίσης να είναι άδεια, η οποία απλά περνά τον έλεγχο στη λίστα των δηλώσεων για την επόμενη case.

<?php
switch ($i) {
    case 
0:
    case 
1:
    case 
2:
        print 
"i is less than 3 but not negative";
        break;
    case 
3:
        print 
"i is 3";
}
?>

Μια ιδιαίτερη case είναι η default case. Αυτή η case ταιριάζει σε οτιδήποτε δεν ταιριάζουν οι άλλες cases, και θα πρέπει να είναι η τελευταία case εντολή. Για παράδειγμα:

<?php
switch ($i) {
    case 
0:
        print 
"i equals 0";
        break;
    case 
1:
        print 
"i equals 1";
        break;
    case 
2:
        print 
"i equals 2";
        break;
    default:
        print 
"i is not equal to 0, 1 or 2";
}
?>

Η έκφραση case μπορεί να είναι μια έκφραση η οποία υπολογίζεται σε έναν απλό τύπο, ο οποίος είναι ακέραιος (integer) ή κινητής υποδιαστολής (floating-point), αριθμοί ή γραμματοσειρές (strings). Πίνακες και αντικείμενα (objects) δεν μπορούν να χρησιμοποιηθούν εδώ, εκτός και αν αναχθούν σε έναν απλούστερο τύπο.

Η εναλλακτική σύνταξη για δομές ελέγχου υποστηρίζεται από τις switches. Για περισσότερες πληροοφορίες, δείτε Εναλλακτική σύνταξη για δομές ελέγχου .

<?php
switch ($i):
    case 
0:
        print 
"i equals 0";
        break;
    case 
1:
        print 
"i equals 1";
        break;
    case 
2:
        print 
"i equals 2";
        break;
    default:
        print 
"i is not equal to 0, 1 or 2";
endswitch;
?>