ΚΕΝΤΡΟ ΠΛΗ.ΝΕ.Τ. Ν. ΦΛΩΡΙΝΑΣ

Η Βίβλος της PHP - Μέρος 2 -
Οι Μεταβλητές και οι Τελεστές

 

Οι Τύποι Δεδομένων της PHP

Η PHP χρησιμοποιεί επτά είδη μεταβλητών (variables), όπου οι έξι απ’ αυτές περιέχουν ένα συγκεκριμένο είδος δεδομένων. Τα επτά είδη μεταβλητών είναι τα εξής : συμβολοσειρές (strings), ακέραιοι (integers), αριθμοί κινητής υποδιαστολής (floats), λογικές τιμές (booleans), πίνακες (arrays), αντικείμενα (objects) και πηγές (resources).

Ας τις δούμε πιο αναλυτικά :

Στην PHP, οι περισσότεροι τύποι δεδομένων (data types) μπορούν να μετατραπούν εύκολα σ’ άλλους τύπους δεδομένων. Ακολουθεί ένα χαρακτηριστικό παράδειγμα :

<?php

$mystring = "14";

$myinteger = 10;

print $mystring + $myinteger;

?>

Το παραπάνω script θα δώσει ως έξοδο την τιμή 24 παρά το ότι η πρώτη μεταβλητή, η $mystring, είναι μια συμβολοσειρά (string) ενώ η δεύτερη μεταβλητή είναι ένας ακέραιος (integer). Η PHP θα προσπαθήσει να μετατρέψει την μη ακέραια μεταβλητή, $mystring, σε ακέραια. Από την άλλη μεριά, αν προσπαθήσουμε να μετατρέψουμε ένα string, όπως είναι το "Florina" σε ακέραιο, η PHP θα επιστρέψει την τιμή 0.

Με τα strings έχουμε μια πολύ χρήσιμη δυνατότητα που είναι η χρήση του συμβολισμού {x}. Καθώς ένα string είναι μια συλλογή από χαρακτήρες, πολλές φορές θέλουμε να διαβάσουμε (απομονώσουμε) ή αλλάξουμε έναν μόνον χαρακτήρα από το string.

Ακολουθεί ένα επεξηγηματικό παράδειγμα :

<?php

$mystring = "Hlorina per sempre?";

$mystring{0} = "F";

$mystring{18} = "!";

print $mystring;

?>

Αρχικά, αλλάζουμε τον πρώτο χαρακτήρα του string, που βρίσκεται στη θέση 0, σε F, και μετά τον 19ο χαρακτήρα (θέση 18) σε θαυμαστικό, οπότε προκύπτει το string "Florina per sempre!". Υπάρχει και η συνάρτηση strlen(), που επιστρέφει το πλήθος των χαρακτήρων ενός string, και την οποία μπορούμε να χρησιμοποιήσουμε για αντικατάσταση χαρακτήρων, ως εξής :

$mystring{strlen($mystring)-1} = "!";

Χρησιμοποιήσαμε το -1 γιατί η συνάρτηση strlen() επιστρέφει το μήκος ενός string, μια τιμή που είναι κατά ένα μεγαλύτερη από τη θέση του τελευταίου χαρακτήρα καθώς η PHP ξεκινάει την αρίθμηση των χαρακτήρων ενός string από τη θέση 0. Αυτό σημαίνει ότι το παραπάνω string περιέχει μεν 19 χαρακτήρες, αλλά η θέση του τελευταίου χαρακτήρα είναι η 18.

 

Έλεγχος Ορισμού μιας Μεταβλητής

Μια πολύ χρήσιμη συνάρτηση είναι η isset(), η οποία δέχεται μια μεταβλητή ως παράμετρο και επιστρέφει τη λογική τιμή true ή false ανάλογα με το αν η μεταβλητή έχει ορισθεί ή όχι. Για παράδειγμα :

<?php

$a = 2;

if (isset($a)) {

echo "Η μεταβλητή a έχει ορισθεί\n";

} else {

echo "Η μεταβλητή a δεν έχει ορισθεί\n";

}

if (isset($b)) {

echo "Η μεταβλητή b έχει ορισθεί\n";

} else {

echo "Η μεταβλητή b δεν έχει ορισθεί\n";

}

?>

Το παραπάνω script θα εμφανίσει τα μηνύματα "Η μεταβλητή a έχει ορισθεί" και "Η μεταβλητή b δεν έχει ορισθεί". Αν προσπαθήσουμε να διαβάσουμε μια μεταβλητή που δεν έχει ορισθεί, η PHP θα εμφανίσει μια προειδοποίηση (warning) ότι πρόκειται για μια άγνωστη μεταβλητή.

 

Αυτόματη Μετατροπή Τύπων Δεδομένων

Η PHP μετατρέπει αυτόματα έναν τύπο δεδομένων σ’ έναν άλλον όποτε αυτό είναι δυνατό. Προβλήματα κατά την αυτόματη μετατροπή ενός τύπου δεδομένων μπορούν να υπάρξουν όταν για παράδειγμα κάνουμε μετατροπή από τύπο boolean σε string, οπότε θα προκύψει η τιμή 1 αν η λογική τιμή είναι ίση με true ή ένα κενό string αν η λογική τιμή είναι ίση με false.

Ας δούμε το παρακάτω script :

<?php

$bool = true;

printbool είναι ίση με $bool\n";

$bool = false;

printbool είναι ίση με $bool\n";

?>

Το παραπάνω script θα εμφανίσει τα εξής :

Η bool είναι ίση με 1

Η bool είναι ίση με

Παρατηρούμε ότι δεν εκτυπώνεται η τιμή 0 για την λογική τιμή 0 (false), αλλά ένα κενό string. Για να το επιλύσουμε αυτό, θα πρέπει να πούμε στην PHP το πώς θέλουμε να γίνει η μετατροπή της τιμής με το typecasting (εκμαγείο τύπων).

Θα πρέπει να ξαναγράψουμε το παραπάνω script για να μετατραπεί η τιμή boolean σε ακέραια (integer), οπότε η λογική τιμή true θα γίνει 1 και η λογική τιμή false θα γίνει 0.

<?php

$bool = true;

printbool είναι ίση με $bool\n";

$bool = false;

printbool είναι ίση με ";

print (int)$bool;

?>

Αυτή τη φορά το script θα εμφανίσει τις τιμές 1 και 0, όπως θα θέλαμε.

 

Αλλαγή Τύπου Δεδομένων

Εκτός από την αυτόματη μετατροπή των τύπων δεδομένων, μπορούμε να χρησιμοποιήσουμε το type cast (εκμαγείο τύπων) ώστε να μετατρέψουμε συγκεκριμένα μια μεταβλητή από τον έναν τύπο δεδομένων στον άλλον. Στην PHP, το type casting γίνεται ως εξής :

<?php

$mystring = "Florina";

$myinteger = (integer)$mystring

?>

Αρχικά, η μεταβλητή $mystring περιέχει ένα string. Αποφασίσαμε να την μετατρέψουμε σε ακέραια (integer), έτσι η PHP θα την κάνει ακέραια και θα τοποθετήσει το αποτέλεσμα στη μεταβλητή $myinteger. Μπορούμε να κάνουμε μετατροπή τύπου δεδομένων σε boolean με το (bool), σε string με το (string) και σε floating-point με το (float).

Μπορούμε να χρησιμοποιήσουμε το type casting στις περιπτώσεις που θέλουμε να είμαστε σίγουροι ότι έχουμε να κάνουμε μ’ έναν συγκεκριμένο τύπο δεδομένων. Για παράδειγμα, αν σ’ ένα script χρειαζόμαστε οπωσδήποτε μια ακέραια τιμή, μια πολύ καλή λύση είναι να μετατρέψουμε (typecast) τη σχετική μεταβλητή με το (integer), ώστε να είμαστε σίγουροι ότι πρόκειται για ακέραιο.

 

Τα μη Δεκαδικά Συστήματα Αρίθμησης

Αν και οι περισσότεροι αριθμοί στην PHP είναι δεκαδικοί (βάση το 10), μπορούμε να χρησιμοποιήσουμε και δεκαεξαδικούς (βάση το 16), hexadecimal, ή και οκταδικούς (βάση το 8), octal. Αν και οι δύο τελευταίες περιπτώσεις είναι σπάνιες, είναι καλό να γνωρίζουμε τον τρόπο απεικόνισής τους αν τυχόν συναντήσουμε 16δικούς ή 8δικούς αριθμούς κάποια στιγμή.

Θα πάρουμε ως παράδειγμα τον δεκαδικό αριθμό 3291, ο οποίος στο 8δικό σύστημα αρίθμησης, το οποίο χρησιμοποιεί τα ψηφία 0 έως και 7, είναι ο 6333. Στο 16δικό σύστημα αρίθμησης, το οποίο χρησιμοποιεί τα ψηφία 0 έως και 9 και μετά τα γράμματα A, B, C, D, E και F, ο αριθμός είναι ο CDB.

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

$octalnum = 6333;

Ο λόγος είναι ότι η PHP θα εκλάβει τον αριθμό ως τον δεκαδικό 6333, για τον οποίο ο αντίστοιχος οκταδικός είναι ο 14,275. Για να προσδιορίσουμε ότι ένας αριθμός είναι γραμμένος σε 8δική μορφή, θα πρέπει να γράψουμε ως πρόθεμα το 0 (zero). Ο κώδικάς μας γίνεται τώρα ως εξής :

<?php

$octalnum = 06333;

print $octalnum;

?>

Το παραπάνω script θα εμφανίσει τον αριθμό 3291, καθώς η PHP πάντα δουλεύει με δεκαδικούς αριθμούς μέσα της και μετατρέπει τον 8δικό αριθμό 06333 στον δεκαδικό 3291 όταν ορίζεται η μεταβλητή $octalnum.

Για να προσδιορίσουμε ότι ένας αριθμός είναι 16δικός, θα πρέπει να δηλώσουμε ως πρόθεμα το 0x. Για παράδειγμα, για να χρησιμοποιήσουμε τον αριθμό 68, θα πρέπει να γράψουμε τον εξής κώδικα :

<?php

$hexnum = 0x44;

print $hexnum;

?>

Και εδώ ο αριθμός θα εμφανισθεί στη δεκαδική του μορφή. Βέβαια, η χρήση της 8δικής μορφή αναγραφής των αριθμών συναντάται μόνο στο Unix όταν καθορίζουμε τα δικαιώματα (permissions) αρχείων και χρηστών. Από την άλλη μεριά, η 16δική μορφή αναγραφής των αριθμών συναντάται πιο συχνά, κυρίως στην κωδικοποίηση των χρωμάτων στην HTML αλλά και αλλού.

 

Η Εμβέλεια των Μεταβλητών

Η κάθε μεταβλητή (variable) έχει μια περιοχή στην οποία υπάρχει, δηλ. μπορούμε να χρησιμοποιήσουμε την τιμή της, που είναι γνωστή ως η εμβέλειά της (scope). Αυτό σημαίνει, όπως ήδη γνωρίζουμε και από άλλες γλώσσες προγραμματισμού, ότι είναι δυνατό σ’ ένα PHP script να έχουμε πολλές μεταβλητές με το ίδιο όνομα, π.χ. $a, σε διάφορα σημεία του κώδικα,  αλλά μία μόνο απ’ αυτές θα μπορεί να είναι ενεργή, δηλ. να χρησιμοποιείται, κάθε φορά.

Οι μεταβλητές που δεν ορίζονται μέσα σε μια συνάρτηση (function) ή σ’ ένα αντικείμενο (object) θεωρούνται ότι είναι καθολικές (global), δηλ. είναι προσβάσιμες από οποιοδήποτε μέρος του script.

 

Οι Μεταβλητές Μεταβλητές

Οι μεταβλητές μεταβλητές (variable variables) μπορεί να ακούγονται παράξενα και να είναι λίγο πολύπλοκες στη χρήση τους, αλλά μπορεί να φανούν πολύ χρήσιμες σε μερικές περιπτώσεις. Με τη βοήθειά τους μπορούμε να έχουμε πρόσβαση στα περιεχόμενα μιας μεταβλητής χωρίς καν να γνωρίζουμε το όνομά της. Ας δούμε το παρακάτω κομμάτι κώδικα :

<?php

$a = 10;

$b = "a";

?>

Υπάρχουν δύο τρόποι για να εμφανίσουμε την τιμή της μεταβλητής $a. Μπορούμε να χρησιμοποιήσουμε την κλασική εντολή print $a; ή μπορούμε να εκμεταλλευτούμε την έννοια των μεταβλητών μεταβλητών και να χρησιμοποιήσουμε την εντολή print $$b;, δηλ. δύο συνεχόμενα σύμβολα $.

Με τον συμβολισμό $$b, η PHP θα ψάξει τα περιεχόμενα της μεταβλητής $b, θα τα μετατρέψει σε string και μετά θα ψάξει τα περιεχόμενα της μεταβλητής που θα προκύψει από την αντικατάσταση της τιμής και θα τα εμφανίσει. Στο παραπάνω παράδειγμα, η μεταβλητή $b περιέχει το "a", έτσι η PHP θα ψάξει τη μεταβλητή με όνομα $a και θα εμφανίσει την τιμή της, δηλ. το 10.

 

Τα Superglobal Arrays

Η PHP περιέχει μερικές πολύ χρήσιμες μεταβλητές που μπορούμε να βρούμε σε ειδικούς πίνακες (arrays) που είναι γνωστοί με τον όρο superglobals. Ο όρος αυτός χρησιμοποιείται γιατί αυτοί οι πίνακες είναι διαθέσιμοι οπουδήποτε σ’ ένα script, ακόμη και μέσα σε τάξεις (classes) και συναρτήσεις (functions). Αυτοί οι πίνακες δεν υπήρχαν στην PHP πριν από την έκδοση v4.1.

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

Όνομα

Λειτουργία

$GLOBALS

Περιέχει όλες τις καθολικές μεταβλητές του script, υπάρχει από την έκδοση PHP 3 και δεν έχει αλλάξει ο τρόπος λειτουργίας του.

$_GET

Περιέχει όλες τις μεταβλητές που στέλνονται μέσω μιας αίτησης (request) HTTP GET, δηλ. στέλνονται μέσω του URL. Σε παλαιότερες εκδόσεις της PHP, χρησιμοποιείτο ο πίνακας $HTTP_GET_VARS, που βρίσκεται ακόμα σε ισχύ.

$_POST

Περιέχει όλες τις μεταβλητές που στέλνονται μέσω μιας αίτησης (request) HTTP POST. Είναι παρόμοιος με τον παλιό πίνακα $HTTP_POST_ VARS, ο οποίος παραμένει ακόμα σε ισχύ.

$_FILES

Περιέχει όλες τις μεταβλητές που στέλνονται μέσω ενός HTTP POST file upload. Είναι παρόμοιος με τον παλιό πίνακα $HTTP_POST_FILES, ο οποίος παραμένει ακόμα σε ισχύ.

$_COOKIE

Περιέχει όλες τις μεταβλητές που στέλνονται μέσω των HTTP cookies. Είναι παρόμοιος με τον παλιό πίνακα $HTTP_COOKIE_VARS, ο οποίος παραμένει ακόμα σε ισχύ.

$_REQUEST

Περιέχει όλες τις μεταβλητές που στέλνονται μέσω των HTTP GET, HTTP POST και HTTP cookies. Αποτελεί στην ουσία το ισοδύναμο του συνδυασμού των $_GET, $_POST και $_COOKIE και είναι λιγότερο επικίνδυνος από τη χρήση του $GLOBALS. Όμως, καθώς περιέχει όλες τις μεταβλητές από μη έμπιστες πηγές, όπως είναι οι επισκέπτες της ιστοσελίδας μας, θα πρέπει να τον χρησιμοποιούμε με επιφύλαξη. Δεν υπάρχει κάτι ισοδύναμο με τον πίνακα $_REQUEST στις εκδόσεις της PHP πριν από την v4.1.

$_SESSION

Περιέχει όλες τις μεταβλητές που αποθηκεύονται κατά τη διάρκεια της συνόδου (session) ενός χρήστης. Είναι παρόμοιος με τον παλιό πίνακα $HTTP_SESSION_VARS, ο οποίος παραμένει ακόμα σε ισχύ.

$_SERVER

Περιέχει όλες τις μεταβλητές που ορίζονται από τον Web server που χρησιμοποιούμε ή από άλλες πηγές που έχουν άμεση σχέση με την εκτέλεση του script. Είναι παρόμοιος με τον παλιό πίνακα $HTTP_SERVER_ VARS, ο οποίος παραμένει ακόμα σε ισχύ.

$_ENV

Περιέχει όλες τις μεταβλητές περιβάλλοντος (environment variables). Είναι παρόμοιος με τον παλιό πίνακα $HTTP_ENV_VARS, ο οποίος παραμένει ακόμα σε ισχύ.

Πολλοί προγραμματιστές χρησιμοποιούν ακόμα την παλιά σύνταξη γι’ αυτές τις μεταβλητές, όπως $HTTP_SERVER_VARS. Υπάρχουν δύο σημαντικές διαφορές ανάμεσα στις παλιές και τις νέες εκδόσεις :

1.    Οι νέες εκδόσεις είναι πιο σύντομες στην πληκτρολόγηση. Αυτό σημαίνει ότι είναι πολύ προτιμότερο να γράφουμε το $_GET παρά το $HTTP_GET_VARS.

2.    Οι νέες εκδόσεις είναι αυτόματα καθολικές (global) παντού στο script, ακόμα και μέσα στις συναρτήσεις (functions). Οι παλαιότερες μεταβλητές, όπως είναι η $HTTP_SESSION_VARS, δεν ήταν διαθέσιμες μέσα στις συναρτήσεις.

Υπάρχουν δύο superglobal arrays που δεν θα πρέπει να χρησιμοποιούμε πολύ, το $GLOBALS και το $_REQUEST και αυτό γιατί και οι δύο αυτοί πίνακες αποτελούν συνδυασμούς από άλλους πίνακες και έτσι αναμειγνύουν δεδομένα που δεν είναι έμπιστα.

Για παράδειγμα, όταν γράφουμε $_COOKIE['somevar'], γνωρίζουμε ότι η τιμή αυτή προέρχεται από ένα cookie που βρίσκεται στο μηχάνημα του χρήστη και όχι από τις καταχωρήσεις κάποιου χρήστη στο URL του site μας. Όμως, όταν γράφουμε $_REQUEST['somevar'], δεν έχουμε κάποια εγγύηση για το περιεχόμενο και βρισκόμαστε στο έλεος του χρήστη.

 

Χρήσιμες Μεταβλητές του Συστήματος

Η PHP διαθέτει κάποιες μεταβλητές που περιέχουν πληροφορίες για τον server, το περιβάλλον (environment) και τις αιτήσεις (requests) που γίνονται από τους επισκέπτες (visitors) του site. Οι τιμές αυτές αποθηκεύονται στα superglobal arrays και μπορούμε να έχουμε μια πλήρη λίστα αυτών με την εντολή phpinfo(). Οι πιο συχνά χρησιμοποιούμενες μεταβλητές, όπου όλες είναι αποθηκευμένες στο superglobal $_SERVER, είναι οι εξής :

Όνομα

Τιμή

HTTP_REFERER

Περιέχει το URL της ιστοσελίδας από την οποία ήρθε ο χρήστης ή είναι κενό (empty) αν ο χρήστης καταχώρησε απευθείας το URL.

HTTP_USER_AGENT

Το όνομα του φυλλομετρητή που χρησιμοποίησε ο χρήστης (επισκέπτης).

PATH_INFO

Τα δεδομένα που μεταβιβάζονται με το URL μετά το όνομα του script.

PHP_SELF

Το όνομα του τρέχοντος script.

REQUEST_METHOD

Μπορεί να είναι GET ή POST.

QUERY_STRING

Περιέχει ό,τι βρίσκεται μετά το σύμβολο ? σ’ ένα GET request.

Προσοχή στην ορθογραφία, είναι HTTP_REFERER και όχι HTTP_ REFERRER. Οι μεταβλητές HTTP_REFERER και HTTP_USER_AGENT είναι οι σημαντικότερες καθώς με τη βοήθειά τους μπορούμε να μάθουμε πολλά για τον επισκέπτη μας, όπως για παράδειγμα :

<?php

if (isset($_SERVER['HTTP_REFERER'])) {

print "Ήρθατε από την ιστοσελίδα :

{$_SERVER['HTTP_REFERER']}<br />";

} else {

print "Ήρθατε απευθείας εδώ<br />";

}

?>

<a href="refer.php">Κάντε κλικ!</a>

 

Οι Αναφορές (References)

Όταν χρησιμοποιούμε τον τελεστή εκχώρησης =, η PHP λαμβάνει την τιμή από τον δεύτερο τελεστέο και την αντιγράφει στον πρώτο τελεστέο. Αυτό είναι καλό για τις περισσότερες περιπτώσεις, αλλά υπάρχουν δύο λόγοι που δεν είναι χρήσιμο, όπως όταν θέλουμε να μπορούμε να αλλάζουμε τον δεύτερο τελεστέο αργότερα και να αλλάζει ταυτόχρονα και ο πρώτος τελεστέος.

Στην PHP 5, τα αντικείμενα (objects) μεταβιβάζονται και εκχωρούνται πάντα με αναφορά (by reference) εξ ορισμού. Αυτό σημαίνει ότι το κάθε αντικείμενο διαθέτει ένα χειριστήριο (handle), το οποίο αναγνωρίζει μοναδικά το αντικείμενο. Όταν αντιγράφουμε ένα αντικείμενο, στην ουσία αντιγράφουμε το χειριστήριο του αντικειμένου, που σημαίνει ότι το αντίγραφο θα αναφέρεται στο ίδιο αντικείμενο με το αρχικό.

Αυτό ήταν διαφορετικό πριν από την PHP 5, όπου τα αντικείμενα αντιμετωπίζονταν όπως όλες οι άλλες μεταβλητές και αντιγράφονταν ολόκληρα με την εκχώρηση. Αυτό ανάγκαζε πολλούς προγραμματιστές να αντιγράφουν πάρα πολλές πληροφορίες στα scripts τους, που ήταν στην ουσία άχρηστες. Από την PHP 5 και μετά, τα αντικείμενα εκχωρούνται πάντα με αναφορά και μεταβιβάζονται στις συναρτήσεις με αναφορά.

Οι αναφορές (references) είναι χρήσιμες καθώς μπορούμε να έχουμε δύο μεταβλητές που να δείχνουν στα ίδια δεδομένα. Εφόσον οι δύο μεταβλητές δείχνουν στα ίδια δεδομένα, μπορούμε να τροποποιήσουμε τη μια από τις δύο και θα αλλάξει και η άλλη. Για να δημιουργήσουμε μια εκχώρηση με αναφορά (assign by reference), θα πρέπει να χρησιμοποιήσουμε τον τελεστή αναφοράς (reference operator), που είναι ο &, μετά από τον τελεστή =, δηλ. =&.

Ακολουθεί ένα παράδειγμα :

<?php

$a = 10;

$b =& $a;

print $a;

print $b;

++$a;

print $a;

print $b;

++$b;

print $a;

print $b;

?>

Εδώ χρησιμοποιούμε τον τελεστή αναφοράς για να κάνουμε το $b να δείχνει στην ίδια τιμή με το $a, όπως μπορεί να φανεί από τις δύο πρώτες εντολές print. Μετά την αύξηση του $a, και οι δύο μεταβλητές θα έχουν την ίδια τιμή, 11. Τέλος, αυξάνουμε το $b και πάλι και οι δύο μεταβλητές $a και $b αποκτούν την ίδια τιμή.

 

Οι Σταθερές (Constants)

Στην περίπτωση που δημιουργούμε μια μεταβλητή σ’ ένα script και δεν σκοπεύουμε να αλλάξουμε την τιμή της, αποτελεί καλή πρακτική να χρησιμοποιήσουμε μια σταθερά (constant). Οι σταθερές (constants) είναι όπως οι μεταβλητές με τη διαφορά ότι αφότου ορισθούν δεν μπορούν να αλλάξουν τιμή μέσα στο script.

Όσον αφορά την PHP, ένα πλεονέκτημα από τη χρήση των σταθερών είναι ότι δεν έχουν το σύμβολο $ στην αρχή του ονόματός τους και είναι έτσι εύκολα διακριτές από τις μεταβλητές. Επίσης, οι σταθερές θεωρούνται αυτόματα καθολικές (global) σ’ όλο το script, σ’ αντίθεση με τις μεταβλητές. Για να ορίσουμε μια σταθερά, χρησιμοποιούμε τη συνάρτηση define(), η οποία δέχεται δύο παραμέτρους, όπου η πρώτη είναι το όνομα της σταθεράς που θέλουμε να δημιουργήσουμε και η δεύτερη η τιμή που θέλουμε να της δώσουμε.

Για παράδειγμα, οι επόμενες εντολές δημιουργούν τη μεταβλητή CURRENT_TIME με τιμή την τιμή επιστροφής της συνάρτησης time(), την οποία και εκτυπώνουν ;

define("CURRENT_TIME", time());

print CURRENT_TIME;

Βλέπουμε ότι το όνομα της σταθεράς δεν είναι το $CURRENT_TIME ούτε το Current_Time, δηλ. οι σταθερές είναι case sensitive, όπως και οι μεταβλητές, αλλά σ’ αντίθεση μ’ αυτές δεν ξεκινούν με το σύμβολο $. Μπορούμε να το αλλάξουμε αυτό, αν περάσουμε μια τρίτη παράμετρο στη συνάρτηση define(), με τιμή true, η οποία παράμετρος κάνει το όνομα της σταθεράς να είναι case-insensitive :

define("CURRENT_TIME", time(), true);

print Current_TiMe;

Υπάρχουν δύο χρήσιμες συναρτήσεις για να δουλέψουμε με τις σταθερές, η defined() και η constant(). Η συνάρτηση defined() είναι το ισοδύναμο της συνάρτησης isset() για τις σταθερές και επιστρέφει την τιμή true αν έχει ορισθεί προηγουμένως το string της σταθεράς που της μεταβιβάζουμε, όπως για παράδειγμα :

define("CURRENT_TIME", time(), true);

if (defined("CURRENT_time")) {

//

}

Βλέπουμε ότι πρέπει να γράψουμε το όνομα της σταθεράς με διπλά εισαγωγικά. Η συνάρτηση constant() επιστρέφει την τιμή μιας σταθεράς και είναι χρήσιμη όταν δεν γνωρίζουμε το όνομα μιας σταθεράς, όπως φαίνεται και στο επόμενο παράδειγμα :

<?php

define("Current_Time", time(), true);

$somevar = "CURRENT_TIME";

print constant($somevar);

?>

 

Οι Προκαθορισμένες Σταθερές της PHP

Υπάρχουν κάποιες σταθερές που έχουν ήδη δημιουργηθεί αυτόματα από την PHP, με πολλές χρήσιμες πληροφορίες. Αυτές είναι οι __FILE__, __LINE__, __FUNCTION__, __CLASS__ και __METHOD__, με διπλό χαρακτήρα κάτω παύλας σε κάθε πλευρά.

Οι πέντε αυτές σταθερές περιέχουν τις εξής πληροφορίες :

Όνομα

Περιγραφή

__FILE__

Το όνομα του script που εκτελείται ή αναλύεται (parsed). Η σταθερά αυτή παρουσιάζει το όνομα του αρχείου που περιέχει την τρέχουσα γραμμή του κώδικα και μπορεί συνεπώς να εμφανίσει και το όνομα ενός αρχείου που γίνεται include.

__LINE__

Ο αριθμός της γραμμής του κώδικα που εκτελεί η PHP.

__FUNCTION__

Το όνομα της συνάρτησης μέσα στην οποία βρίσκεται η PHP.

__CLASS__

Το όνομα της τάξης του αντικειμένου που βρίσκεται σε χρήση.

__METHOD__

Το όνομα της συνάρτησης της τάξης μέσα στην οποία βρίσκεται η PHP.

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

 

Οι Τελεστές

Οι τελεστές (operators) εκτελούν κάποιες ενέργειες σε τελεστέους (operands) και χρησιμοποιούν τιμές εισόδου. Υπάρχουν τρία είδη τελεστών, ο μοναδιαίος (unary), ο δυαδικός (binary) και ο τριαδικός (ternary). Οι μοναδιαίοι τελεστές δέχονται έναν μόνο τελεστέο ως είσοδο, οι δυαδικοί τελεστές δέχονται δύο τελεστέους και οι τριαδικοί τρεις.

Οι σημαντικότεροι τελεστές που πρέπει να γνωρίζουμε είναι οι εξής :

Όνομα

Ενέργεια

+

Δυαδικός. Προσθέτει (αθροίζει) τους δύο τελεστέους.

-

Δυαδικός. Αφαιρεί τον δεύτερο τελεστέο από τον πρώτο.

*

Δυαδικός. Πολλαπλασιάζει τον δεύτερο τελεστέο με τον πρώτο.

/

Δυαδικός. Διαιρεί τον πρώτο τελεστέο με τον δεύτερο.

.

Δυαδικός. Προσθέτει (ενώνει) τον δεύτερο τελεστέο (string) στον πρώτο.

!

Μοναδιαίος. Ενεργεί ως αντιστροφέας, δηλ. η τιμή true γίνεται false και η τιμή false γίνεται true.

++
--

Μοναδιαίος. Αυξάνει (++) ή ελαττώνει (--) κατά ένα την τιμή του τελεστέου.

=

Δυαδικός. Εκχωρεί την τιμή του δεύτερου τελεστέου στον πρώτο.

==

Δυαδικός. Ελέγχει την ισότητα ανάμεσα στους δύο τελεστέους.

===

Δυαδικός. Ελέγχει την απόλυτη ισότητα ανάμεσα στους δύο τελεστέους, δηλ. αν έχουν τις ίδιες τιμές αλλά και αν είναι του ιδίου τύπου δεδομένων.

< >

Δυαδικός. Οι γνωστοί τελεστές σύγκρισης για μικρότερο και μεγαλύτερο.

&&

Δυαδικός. "Λογικό ΚΑΙ (logical AND)", δηλ. ελέγχει αν δύο συνθήκες είναι ταυτόχρονα αληθείς (true).

||

Δυαδικός. "Λογικό Ή (logical OR)", δηλ. ελέγχει αν από δύο συνθήκες η μία τουλάχιστον είναι αληθής (true).

Ακολουθούν χαρακτηριστικά παραδείγματα με μερικούς από τους παραπάνω τελεστές :

<?php

$somevar = 5 + 5;                          // η $somevar γίνεται 10

$somevar = 5 - 5;                           // η $somevar γίνεται 0

$somevar = 5 + 5 - (5 + 5); // η $somevar γίνεται 0

$somevar = 5 * 5;                          // η $somevar γίνεται 25

$somevar = 10 * 5 / 5;                   // η $somevar γίνεται 10

$somevar = $somevar . "προστίθεται στο τέλος";

$somevar = false;

$somevar = !$somevar;        // η $somevar είναι τώρα ίση με true

$somevar = 5;              // η $somevar είναι τώρα ίση με 5

$somevar++;               // η $somevar είναι τώρα ίση με 6

$somevar--;                   // η $somevar είναι τώρα ξανά 5

++$somevar;               // η $somevar είναι τώρα ξανά 6

?>

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

 

Οι Σύντομοι Μοναδιαίοι Τελεστές

Ο τελεστής = έχει μια πολύ ειδική χρήση καθώς μπορούμε να τον συνδυάσουμε μ’ άλλους τελεστές, όπως για παράδειγμα, να κάνουμε τον τελεστή > (μεγαλύτερο από) να σημαίνει μεγαλύτερο από ή ίσο με (>=). Μπορούμε να προσθέσουμε το σύμβολο = στους πρώτους έξι τελεστές της προηγούμενης λίστας, όπως +=, -=, *=, /=, != και .=, για να προκύψουν έτσι σύντομοι μοναδιαίοι τελεστές, ως εξής :

<?php

$somevar = 5;

$somevar += 5; // η $somevar είναι τώρα ίση με 10

$somevar -= 5;   // η $somevar είναι τώρα ίση με 5

$somevar *= 2;  // η $somevar είναι τώρα ίση με 10

$somevar /= 5;   // η $somevar είναι τώρα ίση με 2

$somevar .= " cds";     // η $somevar είναι τώρα ίση με "2 cds"

?>

 

Οι Τελεστές Σύγκρισης

Οι τελεστές σύγκρισης (comparison operators), όπως είναι οι γνωστοί μας <, > και ==, επιστρέφουν την τιμή 1 ή 0 ανάλογα με το αν η σύγκριση είναι αληθής (true) ή ψευδής (false) και αυτή είναι η τιμή που χρησιμοποιεί η PHP. Ας δούμε το παρακάτω κομμάτι PHP κώδικα :

<?php

if ($a < 10) {

//

}

?>

Ο τελεστής < θα συγκρίνει την τιμή της μεταβλητής $a με το 10 και αν είναι μικρότερη (αλλά όχι ίση) από το 10, τότε θα επιστραφεί η τιμή 1. Αυτό κάνει τη γραμμή να είναι ισοδύναμη με τον εξής κώδικα "if (1) {". Όπως αναφέραμε και προηγουμένως, η PHP θεωρεί το 0 ή το τίποτα (nothing) ως ψευδές (false) και ο,τιδήποτε άλλο ως αληθές (true), οπότε η παραπάνω γραμμή γίνεται "if (true) {".

Θα δούμε τώρα ένα λάθος που γίνεται συχνά :

<?php

if ($a <= $b <= $c) {

//

}

?>

Εδώ φαινομενικά θέλουμε να ελέγξουμε αν το $b είναι μεγαλύτερο από ή ίσο με το $a αλλά και μικρότερο από ή ίσο με το $c. Αυτό, όμως, που θα συμβεί θα είναι κάτι άλλο και αυτό γιατί η PHP συγκρίνει το $a με το $b και αν το $a είναι μικρότερο από ή ίσο με το $b τότε η συνθήκη θα γίνει ίση με 1, δηλ. true.

Στη συνέχεια, βλέπουμε ότι η PHP συγκρίνει το 1 με το $c, δηλ. αν το 1 είναι μικρότερο από ή ίσο με την τιμή της μεταβλητής $c. Φυσικά, δεν επιδιώκαμε κάτι τέτοιο και έτσι πρέπει να ξαναγράψουμε τον κώδικα ως εξής :

<?php

if ($a <= $b && $b <= $c) {

// …

}

?>

Θα δούμε τώρα κάτι άλλο. Έχουμε το παρακάτω script :

if (31415926535897932 == 31415926535897933) {

echo "Οι αριθμοί είναι ίδιοι!\n";

} else {

echo "Οι αριθμοί δεν είναι ίδιοι!\n";

}

Πρόκειται για τον γνωστό αριθμό π της γεωμετρίας με 17 ψηφία και χωρίς τα δεκαδικά, μόνο που στη δεξιά μεριά τον έχουμε αυξήσει κατά ένα. Το περίεργο είναι ότι το παραπάνω script θα εμφανίσει το μήνυμα "Οι αριθμοί είναι ίδιοι!" αν και σε μας φαίνονται διαφορετικοί. Ο λόγος είναι ότι η PHP δεν δουλεύει καλά με τόσο μεγάλους αριθμούς και μετά από ένα συγκεκριμένο σημείο δεν είναι σε θέση να συγκρίνει αριθμούς με τον γνωστό τελεστή σύγκρισης ==.

Αν προσπαθήσουμε να προσθέσουμε δύο πολύ μεγάλους ακέραιους αριθμούς, η PHP θα διαπιστώσει ότι το αποτέλεσμα είναι υπερβολικά μεγάλο για να τοποθετηθεί σ’ έναν κανονικό ακέραιο (integer number) και έτσι θα το εκχωρήσει σ’ έναν αριθμό κινητής υποδιαστολής (floating-point number). Όμως, και για τους αριθμούς κινητής υποδιαστολής υπάρχει κάποιο όριο, κάπου κοντά στα 16 ψηφία, όπου η PHP χάνει τον έλεγχο. Αυτό φαίνεται καθαρά από το παρακάτω script :

$a =  2147483647;

var_dump($a);

++$a;

var_dump($a);

$b1 = 31415926535897932;

$b2 = 31415926535897933;

var_dump($b1);

var_dump($b2);

Η έξοδος που θα προκύψει θα είναι η εξής :

int(2147483647)

float(2147483648)

float(31415926535898000)

float(31415926535898000)

Βλέπουμε ότι ο πρώτος αριθμός είναι τύπου int (integer), αλλά αν του προσθέσουμε το 1 ξεπερνάει το όριο των ακεραίων και έτσι η PHP τον μετατρέπει σε αριθμό κινητής υποδιαστολής (float). Ενδιαφέρον έχει και η έξοδος των δύο τελευταίων αριθμών, όπου και οι δύο είναι του τύπου float και επειδή η αποδεκτή ακρίβεια των floats είναι 14 δεκαδικά ψηφία, περικόπτονται και οι δύο στον αριθμό 31415926535898. Αυτό σημαίνει ότι θεωρούνται ίσοι για την PHP σε πιθανή σύγκριση.

Μπορούμε να πούμε ότι υπάρχουν δύο λύσεις σ’ αυτό το πρόβλημα. Πρώτα, μπορούμε να συγκρίνουμε τους δύο αριθμούς σαν να ήταν strings και αυτό γιατί η PHP συγκρίνει τα strings γράμμα-γράμμα και μπορεί να συγκρίνει strings οποιουδήποτε μεγέθους. Βέβαια, δεν αποτελεί απλή διαδικασία η μετατροπή ενός αριθμού σε string με τη χρήση των εισαγωγικών (quotes) και αυτό γιατί η PHP καθώς είναι μια typeless γλώσσα προγραμματισμού θα δει ότι το string περιέχει αριθμούς και θα το μετατρέψει αυτόματα σε integer, οπότε το πρόβλημα δεν επιλύεται άμεσα.

Η λύση σ’ αυτό το πρόβλημα είναι η χρήση του τελεστή απόλυτης ισότητας (absolute equality operator), ===, ο οποίος ελέγχει όχι μόνο αν δύο τιμές είναι ίδιες αλλά αν είναι και του ιδίου τύπου δεδομένων. Συνεπώς, αν χρησιμοποιήσουμε διπλά εισαγωγικά γύρω από τους αριθμούς για να τους μετατρέψουμε σε strings και τους συγκρίνουμε με το ===, η PHP δεν θα τους μετατρέψει αυτόματα σε ακεραίους και θα τους συγκρίνει ως strings, ως εξής :

if ("31415926535897932" === "31415926535897933") {

echo "Οι αριθμοί είναι ίδιοι!\n";

} else {

echo "Οι αριθμοί δεν είναι ίδιοι!\n";

}

 

Πλήρης Λίστα των Τελεστών

Ακολουθεί μια πλήρης λίστα των τελεστών της PHP.

Αριθμητικοί Τελεστές

$a + $b

Πρόσθεση

Άθροισμα των $a και $b

$a - $b

Αφαίρεση

Διαφορά του $a μείον $b

$a * $b

Πολλαπλασιασμός

Γινόμενο των $a και $b

$a / $b

Διαίρεση

Διαίρεση του $a με το $b

$a % $b

Ακέραιο υπόλοιπο (modulus)

Υπόλοιπο της διαίρεσης του $a με το $b

Τελεστές Εκχώρησης

$a = $b

Εκχώρηση

Κάνει το $a ίσο με το $b

$a =& $b

Αναφορά

Κάνει το $a να δείχνει στο $b

Η διαφορά ανάμεσα στην απλή εκχώρηση και την αναφορά (reference) είναι ότι όταν κάνουμε εκχώρηση τιμής με αναφορά, κάθε φορά που αλλάζει η μια από τις δύο μεταβλητές, αλλάζει και η άλλη.

Τελεστές Δυαδικών Πράξεων

$a & $b

And

Κάνει τη λογική πράξη ΚΑΙ στα bits του $a και του $b

$a | $b

Or

Κάνει τη λογική πράξη Ή στα bits του $a και του $b

$a Ù $b

Xor

Κάνει τη λογική πράξη Αποκλειστικού Ή στα bits του $a και του $b

~$a

Not

Κάνει τη λογική πράξη της Αντιστροφής στα bits του $a

$a << $b

Shift left

Μετατοπίζει τα bits του $a προς τα αριστερά κατά $b βήματα

$a >> $b

Shift right

Μετατοπίζει τα bits του $a προς τα δεξιά κατά $b βήματα

Οι τελεστές δυαδικών πράξεων (bitwise operators) δεν χρησιμοποιούνται πολύ συχνά και μόνο από προχωρημένους προγραμματιστές της PHP. Για παράδειγμα, ο αριθμός 8 έχει αντίστοιχο στο δυαδικό σύστημα αρίθμησης με 8 ψηφία τον 00001000. Αν κάνουμε μετατόπιση προς τα αριστερά (shift left, <<) θα προκύψει ο αριθμός 00010000, που είναι ο 16 στο δεκαδικό σύστημα αρίθμησης. Στην ουσία γίνεται πολλαπλασιασμός με τον αριθμό 2.

Ο τελεστής & (bitwise and) συγκρίνει όλα τα bits και των δύο τελεστέων ένα προς ένα και επιστρέφει ένα αποτέλεσμα με τη λογική πράξη ΚΑΙ να εφαρμόζεται σε κάθε ζευγάρι bits. Για παράδειγμα, αν έχουμε να κάνουμε την πράξη 52 & 28, στην ουσία έχουμε τους δυαδικούς αριθμούς 00110100 (52) και 00011100 (28). Η PHP καθώς κάνει τις συγκρίσεις, όπου βρίσκει το 1 και στους δύο αριθμούς, βάζει το 1 στην αντίστοιχη θέση στο αποτέλεσμα, αλλιώς βάζει το 0, οπότε έχουμε το εξής :

00110100 (52)

00011100 (28)

00010100 (20)

Ο τελεστής | (bitwise or) συγκρίνει τα αντίστοιχα bits των δύο τελεστέων και βάζει το 1 στην αντίστοιχη θέση στο αποτέλεσμα αν υπάρχει το 1 σ’ ένα τουλάχιστον από τα δύο bits, αλλιώς βάζει το 0, ως εξής :

00110100 (52)

11010001 (209)

11110101 (245)

Τελεστές Σύγκρισης

Όλες οι τελεστές σύγκρισης επιστρέφουν την τιμή true ή false.

$a == $b

Ίσο

Αληθές αν το $a είναι ίσο με το $b

$a === $b

Ισοδύναμο

Αληθές αν τοf $a είναι ίσο με το $b και του ιδίου τύπου

$a != $b

Όχι ίσο

Αληθές αν το $a δεν είναι ίσο με το $b

$a <> $b

Όχι ίσο

Αληθές αν το $a δεν είναι ίσο με το $b

$a !== $b

Όχι ισοδύναμο

Αληθές αν το $a δεν είναι ίσο με το $b ή αν δεν είναι του ιδίου τύπου δεδομένων

$a < $b

Μικρότερο από

Αληθές αν το $a είναι μικρότερο από το $b

$a > $b

Μεγαλύτερο από

Αληθές αν το $a είναι μεγαλύτερο από το $b

$a <= $b

Μικρότερο από ή ίσο με

Αληθές αν το $a είναι μικρότερο από ή ίσο με το $b

$a >= $b

Μεγαλύτερο από ή ίσο με

Αληθές αν το $a είναι μεγαλύτερο από ή ίσο με το $b

Πάντως, είναι γεγονός ότι οι προγραμματιστές της PHP προτιμούν τον τελεστή ανισότητας != από τον <>, παρά το ότι κάνουν την ίδια δουλειά, μάλλον επηρεασμένοι από τη γλώσσα C, η οποία χρησιμοποιεί μόνο τον τελεστή !=.

Ο τελεστής απόλυτης ισότητας (identical operator), ===, μπορεί να μην είναι τόσο γνωστός και να χρησιμοποιείται σπάνια σε σχέση με τον γνωστό τελεστή ==, αλλά μπορεί να φανεί χρήσιμος μερικές φορές. Ακολουθεί ένα χαρακτηριστικό παράδειγμα :

<?php

print 12 == 12;

print 12 === 12;

print "12" == 12;

print "12" === 12;

?>

Αν εκτελέσουμε το παραπάνω script, θα δούμε ότι η PHP εμφανίζει το αποτέλεσμα 1 για τις τρεις πρώτες γραμμές και τίποτα για την τελευταία γραμμή. Αυτό σημαίνει ότι οι τρεις πρώτες εντολές είναι αληθείς (true).

Η PHP θεωρεί την τελευταία εντολή ως ψευδή (false) καθώς μπορεί τα "12" και 12 να έχουν την ίδια τιμή, αλλά είναι διαφορετικού τύπου καθώς το πρώτο είναι string και το δεύτερο είναι αριθμός.

Τελεστές Αύξησης και Μείωσης

++$a

Προ-αύξηση

Αυξάνει το $a κατά ένα και μετά το επιστρέφει

$a++

Μετά-αύξηση

Επιστρέφει το $a και μετά το αυξάνει κατά ένα

--$a

Προ-μείωση

Ελαττώνει το $a κατά ένα και μετά το επιστρέφει

$a--

Μετά-μείωση

Επιστρέφει το $a και μετά το μειώνει κατά ένα

Όπως βλέπουμε, οι τελεστές αύξησης και μείωσης (incrementing and decrementing operators) μπορούν να τοποθετηθούν είτε πριν είτε μετά από μια μεταβλητή και το αποτέλεσμα εξαρτάται από τη θέση του τελεστή. Ακολουθεί ένα επεξηγηματικό παράδειγμα :

<?php

$a = 5;

$b = $a++;

print "Το a είναι $a\n";

print "Το b είναι $b\n";

?>

Το παραπάνω script θα εμφανίσει το εξής :

Το a είναι 6

Το b είναι 5

Ο λόγος είναι ότι επειδή ο τελεστής ++, όταν τοποθετείται μετά από μια μεταβλητή, πρώτα επιστρέφει την αρχική τιμή της μεταβλητής και μετά την αυξάνει. Αν είχαμε τοποθετήσει τον τελεστή ++ πριν από την μεταβλητή $a, η μεταβλητή πρώτα θα αύξανε και μετά θα επιστρεφόταν η τιμή της, οπότε και οι δύο μεταβλητές $a και $b θα είχαν την τιμή 6.

Λογικοί Τελεστές

$a and $b

And

Αληθές αν και τα δύο $a και $b είναι αληθή

$a && $b

And

Αληθές αν και τα δύο $a και $b είναι αληθή

$a or $b

Or

Αληθές αν ένα από τα $a ή $b είναι αληθές

$a || $b

Or

Αληθές αν ένα από τα $a ή $b είναι αληθές

$a xor $b

Xor

Αληθές αν ένα από τα $a ή $b είναι αληθές, αλλά όχι και τα δύο ταυτόχρονα

!$a

Not

Αληθές αν το $a δεν είναι αληθές

Όπως μπορούμε να δούμε, υπάρχουν δύο τελεστές για το λογικό AND (ΚΑΙ) και δύο τελεστές για το λογικό OR (Ή). Αυτή η δυνατότητα ίσως να υπάρχει για να ικανοποιούνται οι προγραμματιστές της C αλλά και των άλλων γλωσσών προγραμματισμού.

Θα πρέπει να έχουμε υπόψη μας ότι η PHP χρησιμοποιεί τη βραχυκύκλωση των εντολών υπό συνθήκη (conditional statement short-circuiting), που σημαίνει ότι όταν συναντήσει μια έκφραση της μορφής A or B και διαπιστώσει ότι το A είναι true, δεν θα μπει στον κόπο να υπολογίσει και το B καθώς η συνθήκη θα είναι έτσι κι αλλιώς true.

 

Ο Τριαδικός Τελεστής

Ο τριαδικός τελεστής (ternary operator) δέχεται τρεις τελεστέους, που είναι μια συνθήκη, ένα αποτέλεσμα αν η συνθήκη είναι true και ένα αποτέλεσμα αν η συνθήκη είναι false. Μπορούμε να πούμε ότι ο τριαδικός τελεστής αποτελεί μια σύντομη μορφή της εντολής ifelse, ως εξής :

<?php

$agestr = ($age < 16) ? 'παιδί' : 'ενήλικας';

?>

Αρχικά έχουμε μια συνθήκη ($age < 16), μετά το σύμβολο ?, το αποτέλεσμα αν η συνθήκη είναι true, το σύμβολο : και το αποτέλεσμα αν η συνθήκη είναι false. Αν η τιμή της μεταβλητής $age είναι μικρότερη από 16, η μεταβλητή $agestr θα πάρει την τιμή 'παιδί', αλλιώς θα πάρει την τιμή 'ενήλικας'.

Το ισοδύναμο της παραπάνω εντολής με μια κανονική εντολή if είναι το εξής :

<?php

if ($age < 16) {

$agestr = 'παιδί';

} else {

$agestr = 'ενήλικας';

}

?>

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

 

Ο Τελεστής Εκτέλεσης

Ο τελεστής εκτέλεσης (execution operator) είναι η μονή ανάστροφη απόστροφος (`, back tick), την οποία μπορούμε να βρούμε συνήθως στα αριστερά του πλήκτρου 1 στο πληκτρολόγιο. Ο τελεστής αυτός στην PHP είναι πολύ έξυπνος καθώς μας δίνει τη δυνατότητα να περάσουμε εντολές απευθείας στο λειτουργικό σύστημα για εκτέλεση και να πάρουμε τα αποτελέσματα. Για παράδειγμα :

print `ls`;

Η παραπάνω εντολή θα εκτελέσει την εντολή "ls" του λειτουργικού συστήματος και θα εμφανίσει το αποτέλεσμα στην οθόνη. Για τα Windows, θα πρέπει να χρησιμοποιήσουμε την αντίστοιχη εντολή "dir" καθώς η εντολή ls υπάρχει μόνο στο Unix. Μέσα στα back ticks μπορούμε να εκτελέσουμε όποια εντολή θέλουμε όπως θα την δίναμε και από τη γραμμή εντολών.

 

Η Προτεραιότητα των Τελεστών

Όπως όλες οι γνωστές γλώσσες προγραμματισμού, έτσι και η PHP διαθέτει κάποιους κανόνες σχετικά με την προτεραιότητα των τελεστών (operator precedence). Ας δούμε, για παράδειγμα, την επόμενη εντολή :

$a = 5 * 10 – 1;

Η τιμή της μεταβλητής $a θα είναι 49 ή 45; Θα μπορούσαμε, βέβαια, να είχαμε χρησιμοποιήσει παρενθέσεις για να είμαστε πιο σαφείς, ως εξής :

$a = (5 * 10) – 1;

$a = 5 * (10 – 1);

Στην πρώτη περίπτωση, το 5 πολλαπλασιάζεται με το 10 και μετά αφαιρείται το 1 από το αποτέλεσμα, προκύπτει έτσι το 49, αλλά στη δεύτερη περίπτωση, πρώτα αφαιρείται το 1 από το 10 και έχουμε το 9 και μετά το 9 πολλαπλασιάζεται με το 5 και έχουμε έτσι ως τελικό αποτέλεσμα το 45.

Θα πρέπει να έχουμε πάντα υπόψη μας τις προτεραιότητες των τελεστών της PHP, που είναι παρόμοιες με τις γνωστές μας και από άλλες γλώσσες προγραμματισμού, ή μπορούμε να χρησιμοποιούμε παρενθέσεις κάθε φορά που έχουμε αμφιβολία για το αν είναι σωστά γραμμένη μια εντολή.

Ας δούμε και την επόμενη εντολή :

$a = 5 – 5 – 5;

Και εδώ μπορούμε να έχουμε δύο πιθανά αποτελέσματα, το 5 και το –5. Μπορούμε να χρησιμοποιήσουμε παρενθέσεις για να γίνουμε πιο σαφείς :

$a = 5 (5 5);

$a = (5 5) 5;

Στην περίπτωση αυτή που έχουμε δύο ίδιες πράξεις, ισχύει το ότι πρώτα εκτελείται η εντολή που βρίσκεται στα αριστερά (operator associativity). Επειδή το 5 που είναι στη μέση έχει το σύμβολο – (minus) και στις δύο πλευρές του και επειδή το – είναι left-associative, γίνεται πρώτα η αριστερή πράξη και έτσι έχουμε ως αποτέλεσμα, χωρίς βέβαια τη χρήση των παρενθέσεων, το –5.

Ακολουθεί μια πλήρης λίστα που περιέχει όλους τους τελεστές της PHP, από τη χαμηλότερη προς την υψηλότερη προτεραιότητα και με την κατεύθυνση της προτεραιότητας (associativity) :

Associativity

Τελεστές

left

,

left

or

left

xor

left

and

right

print

right

= += -= *= /= .= %= &= |= ^= <<= >>=

left

? :

left

||

left

&&

left

|

left

^

left

&

non-associative

== != === !==

non-associative

< <= > >=

left

<< >>

left

+ - .

left

* / %

right

! ~ ++ -- (int) (float) (string) (array) (object) @

right

[

non-associative

new

 

 

back.gif (9867 bytes)

Επιστροφή