Forum und email

Εκφράσεις

Οι εκφράσεις (expressions) είναι το πιο σηματικό κομμάτι της PHP. Στην PHP, σχεδόν όλα όσα γράφετε είναι εκφράσεις. Ο απλούστερος και συγχρόνως ο πιο ακριβής τρόπος για να ορίσουμε μια έκφραση είναι "οτιδήποτε έχει τιμή".

Οι πιο βασικές μορφές εκφράσεων είναι οι σταθερές και οι μεταβλητές. Όταν γράφετε "$a = 5", αναθέτε την τιμή '5' στη μεταβλητή $a. Το '5', προφανώς, έχει την τιμή 5, ή με άλλα λόγια το '5' είναι μια έκφραση με την τιμή 5 (σ'αυτή την περίπτωση, το '5' είναι μια ακέραια σταθερά).

Μετά από αυτή την ανάθεση, θα περιμένατε η τιμή του $a να είναι επίσης 5, έτσι ώστε αν γράψετε $b = $a, θα περιμένετε να έχετε το ίδιο αποτέλεσμα με το αυτό που θα είχατε αν γράφατε ότι $b = 5. Με άλλα λόγια, η $a είναι μια έκφραση με την τιμή 5 επίσης. Αν όλα δουλέψουν σωστά, αυτό ακριβώς θα συμβεί.

Ελαφρώς πιο περίπλοκα παραδείγματα στις εκφράσεις είναι οι συναρτήσεις. Για παράδειγμα, θεωρείστε την ακόλουθη συνάρτηση:

<?php
function foo ()
{
    return 
5;
}
?>

Υποθέτοντας ότι είστε εξοικειωμένοι με την έννοια των συναρτήσεων (αν δεν είστε ανατρέξτε στο κεφάλαιο το σχετικό με τις συναρτήσεις), θα υποθέσετε ότι γράφοντας $c = foo() είναι ουσιαστικά ίδιο με το να γράψετε $c = 5, και έχετε δίκιο. Οι συναρτήσεις είναι εκφράσεις με την τιμή της επιστρεφόμενης τιμής. Αφού το foo() επιστρέφει 5, η τιμή της έκφρασης 'foo()' είναι 5. Συνήθως οι συναρτήσεις δεν επιστρέφουν απλά μια στατική τιμή αλλά υπολογίζουν κάτι.

Φυσικά, οι τιμές στην PHP δεν είναι υποχρεωτικά ακέραιοι, και πολύ συχνά δεν είναι. Η PHP υποστηρίζει τρεις βαθμωτούς τύπους: ακέραιες τιμές, τιμές κινητής υποδιαστολής και συμβολοσειρές (οι βαθμωτές τιμές είναι τιμές που δεν μπορούμε να "σπάσουμε" σε μικρότερα κομμάτια, σε αντίθεση με τους πίνακες, για παράδειγμα). Η PHP επίσης υποστηρίζει δυο σύνθετους (μη βαθμωτούς) τύπους: τους πίνακες (arrays) και τα αντικείμενα (objects). Ο κάθε ένας από αυτούς τους τύπους τιμών μπορεί να ανατεθεί σε μεταβλητές ή να επιστραφεί (returned) από συναρτήσεις.

Μέχρι στιγμής, οι χρήστες της PHP/FI 2 δε θα βρούν κάποια διαφορά. Παρ' όλα αυτά, η PHP προχωράει τις εκφράσεις πιο μακριά, κατά τον ίδιο τρόπο που το κάνουν και άλλες γλώσσες. Η PHP είναι μια γλώσσα προσανατολισμένη στις εκφράσεις (expression-oriented), με την έννοια ότι σχεδόν τα πάντα είναι εκφράσεις. Θεωρείστε το παράδειγμα με το οποίο έχουμε ήδη ασχοληθεί, '$a = 5'. Είναι εύκολο να δείτε ότι υπάρχουν δύο τιμές εδώ, η τιμή της ακέραιας σταθεράς '5', και η τιμή της μεταβλητής $a η οποία παίρνει επίσης την τιμή 5. Αλλά η αλήθεια είναι ότι υπάρχει μια επιπρόσθετη τιμή που εμπλέκεται εδώ, και αυτή είναι η τιμή της ίδιας της ανάθεσης. Η ίδια η ανάθεση (assignment) παίρνει την ανατιθέμενη τιμή, που στην περίπτωση μας είναι η 5. Πρακτικά, αυτό σημαίνει ότι '$a = 5',ασχέτως από το τι κάνει, είναι μια έκφραση με τιμή ίση με 5. Συνεπώς, γράφοντας κάτι σαν '$b = ($a = 5)' είναι σα να γράφουμε '$a = 5; $b = 5;' (το ερωτηματικό ορίζει το τέλος μιας έκφρασης). Αφού οι αναθέσεις μεταγλωτίζονται από δεξιά προς τα αριστερά, μπορείτε επίσης να γράψετε '$b = $a = 5'.

Ένα ακόμη καλό παράδειγμα σχετικά με εκφράσεις είναι η πριν (pre-) και μετά (post-) αύξηση και μείωση. Οι χρήστες της PHP/FI 2 και πολλών άλλων γλωσσών ίσως έχουν κάποια οικειότητα με τη μορφή variable++ και variable--. Αυτοί είναι οι τελεστές αύξησης και μείωσης. Στην PHP/FI 2, η δήλωση '$a++' δεν έχει τιμή (δεν είναι έκφραση), και συνεπώς δεν μπορείτε να την αναθέσετε ούτε να την χρησιμοποιήσετε. Η PHP αυξάνει τις δυνατότητες αύξησης/μείωσης χρησιμοποιώντας αυτές της εκφράσεις όπως και η C. Στην PHP, όπως και στη C, υπάρχουν δυο τύποι αύξησης - η (προ) pre-increment και η (μετά) post-increment. Και οι δυο ουσιαστικά αυξάνουν την τιμή της μεταβλητής, και η επίδραση τους στην μεταβλητή είναι η ίδια. Η διαφορά είναι στην τιμή της μεταβλητής που αυξάνεται. Η pre-increment, η οποία γράφεται '++$variable', παίρνει την αυξανόμενη τιμή (η PHP αυξάνει τη μεταβλητή πριν διαβάσει την τιμή της, εξού και (προ)'pre-increment'). Η post-increment, η οποία γράφεται '$variable++' παίρνει την αρχική τιμή της μεταβλητής $variable, πριν αυτή αυξηθεί (η PHP αυξάνει τη μεταβλητή αφού διαβάσει την τιμή της, εξού και το όνομα (μετά) 'post-increment')

Ένας πολύ κοινός τύπος εκφράσεων είναι οι συγκρίσεις. Αυτές οι εκφράσεις παίρνουν είτε την τιμή 0 είτε την τιμή 1, δηλαδή FALSE ή TRUE (αντίστοιχα). Η PHP υποστηρίζει τα > (μεγαλύτερο από), >= (μεγαλύτερο από ή ίσο με), == (ίσο), != (όχι ίσο), < (μικρότερο από) και <= (μικρότερο ή ίσο με). Αυτές οι εκφράσεις χρησιμοποιούνται συνήθως μέσα σε υποθέσεις, όπως οι if δηλώσεις.

Το τελευταίο παράδειγμα εκφράσεων με το οποίο θα ασχοληθούμε είναι οι σύνθετες εκφράσεις τελεστών-αναθέσεων. Θα ξέρετε ήδη ότι αν θέλετε να αυξήσετε το $a κατά 1, μπορείτε απλά να γράψετε '$a++' ή '++$a'. Αλλά τι γίνεται να θέλετε να προσθέσετε περισσότερα από ένα, 3 για παράδειγμα? Θα μπορούσατε να γράψετε '$a++' πολλές φορές, αλλά αυτό προφανώς δεν είναι ένας πολύ αποτελεσματικός ή άνετος τρόπος. Μια πιο κοινή τακτική είναι να γράψετε '$a = $a + 3'. Το '$a + 3' υπολογίζει την τιμή του $a συν 3, και αναθέτει την τιμή αυτή πίσω στην $a, η οποία καταλήγει στο να αυξηθεί κατά 3. Στην PHP, όπως και σε πολλές άλλες γλώσσες συμπεριλαμβανομένης και της C, μπορείτε να γράψετε το παραπάνω με ένα συντομότερο τρόπο, το οποίο θα γίνει πιο ξεκάθαρο και πιο γρήγορο στο να το καταλάβετε καλά. Η πρόσθεση του 3 στην τρέχουσα τιμή του $a μπορεί να γραφεί ως '$a += 3'. Αυτό ακριβώς σημαίνει "πάρε την τιμή του $a, πρόσθεσε 3 σ' αυτήν, και ανάθεσε την πάλι στην $a". Προκειμένου να γίνουμε πιο γρήγοροι και πιο σαφείς, μ'αυτόν τον τρόπο καταλήγουμε σε ταχύτερη εκτέλεση. Η τιμή του '$a += 3', όπως και η τιμή μιας κανονικής (regular) ανάθεσης, είναι η τιμή που έχει ανατεθεί. Σημειώστε ότι ΔΕΝ είναι 3, αλλά η τιμή της $a συν 3 (αυτή είναι η τιμή που ανατίθεται στην $a). Οποιοσδήποτε δυο-θέσεων τελεστής μπορεί να χρησιμοποιηθεί σ' αυτή την κατάσταση τελεστή-ανάθεσης, για παράδειγμα '$a -= 5' (αφαιρείται το 5 από την τιμή του $a), '$b *= 7' (πολλαπλασιάζεται η τιμή της $b με το 7), κτλ.

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

<?php
$first ? $second : $third
?>

Αν η τιμή της πρώτης υπό-έκφρασης είναι TRUE (όχι μηδέν), τότε γίνεται υπολογισμός της τιμής της δεύτερης υπό-έκφρασης, και αυτό είναι το αποτέλεσμα της υποθετικής έκφρασης. Διαφορετικά, η τρίτη υποέκφραση υπολογίζεται και αυτή είναι και η τιμή.

Το παρακάτω παράδειγμα θα σας βοηθήσει να καταλάβετε καλύτερα την προ- (pre-) και μετά- (post-) αύξηση και τις εκφράσεις γενικότερα:

<?php
function double($i)
{
    return 
$i*2;
}
$b $a 5;        /* assign the value five into the variable $a and $b */
$c $a++;          /* post-increment, assign original value of $a 
                       (5) to $c */
$e $d = ++$b;     /* pre-increment, assign the incremented value of 
                       $b (6) to $d and $e */

/* at this point, both $d and $e are equal to 6 */

$f double($d++);  /* assign twice the value of $d before
                       the increment, 2*6 = 12 to $f */
$g double(++$e);  /* assign twice the value of $e after
                       the increment, 2*7 = 14 to $g */
$h $g += 10;      /* first, $g is incremented by 10 and ends with the 
                       value of 24. the value of the assignment (24) is 
                       then assigned into $h, and $h ends with the value 
                       of 24 as well. */
?>

Στην αρχή του κεφαλαίου, είπαμε ότι θα περιγράψουμε τους διάφορους τύπος δηλώσεων, και όπως υποσχεθήκαμε, οι εκφράσεις μπορούν να γίνουν δηλώσεις. Όπως και να έχει, δεν είναι κάθε έκφραση και δήλωση. Σ' αυτή την περίπτωση, μια δήλωση έχει τη μορφή 'expr' ';' το οποίο είναι μια έκφραση που ακολουθείται από ένα ελληνικό ερωτηματικό. Στο '$b=$a=5;', το $a=5 είναι μια έγκυρη έκφραση, αλλά δεν είναι από μόνη της μια έκφραση. Παρόλαυτα η έκφραση '$b=$a=5;' είναι μια έγκυρη δήλωση.

Ένα τελευταίο πράγμα που αξίζει να αναφέρουμε είναι η αληθινή αξία των εκφράσεων. Σε πολλά συμβάντα, κυρίως σε loops υποθετικά και εκτέλεσης, δεν ενδιαφέρεστε για τη συγκεκριμένη τιμή της έκφρασης, αλλά μόνο για το τι σημαίνει TRUE ή FALSE. Οι σταθερές TRUE και FALSE (είναι case-insensitive) είναι οι δυο πιθανές boolean τιμές. Όταν χρειάζεται, μια έκφραση αυτόματα μετατρέπεται σε boolean. Δείτε το τμήμα σχετικά με type-casting (μετατροπή τύπου) για λεπτομέρειες σχετικά με τον τρόπο.

Η PHP παρέχει μια πλήρη και δυνατή υλοποίηση των εκφράσεων, και η τεκμηρίωση της είναι πέρα από το σκοπό αυτού του εγχειριδίου. Τα παραπάνω παραδείγματα είναι για να σας δώσουν μια ιδέα σχετικά με το τι είναι οι εκφράσεις και πώς μπορείτε να σχηματίσετε χρήσιμες εκφράσεις. Στο υπόλοιπο manual θα γράφουμε expr για να συμβολίσουμε κάθε έγκυρη έκφραση στην PHP.