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

Η Γλώσσα Προγραμματισμού PHP (Αναλυτικά)

 

Τι Είναι η PHP

Η PHP, όπου τα αρχικά σημαίνουν Hypertext PreProcessor, είναι μια γλώσσα συγγραφής σεναρίων (scripting language) που ενσωματώνεται μέσα στον κώδικα της HTML και εκτελείται στην πλευρά του server (server-side scripting).

Ανταγωνιστικές της τεχνολογίας PHP είναι οι εξής γλώσσες προγραμματισμού : ASP (Active Server Pages) της εταιρείας Microsoft, CFML (ColdFusion Markup Language) της εταιρείας Allaire και JSP (JavaServer Pages) της εταιρείας Sun.

Το μεγαλύτερο μέρος της σύνταξής της, η PHP το έχει δανειστεί από την C, την Java και την Perl και διαθέτει και μερικά δικά της μοναδικά χαρακτηριστικά. Ο σκοπός της γλώσσας είναι να δώσει τη δυνατότητα στους web developers να δημιουργούν δυναμικά παραγόμενες ιστοσελίδες.

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

<html>

<head>

<title> Παράδειγμα </title>

</head>

<body>

<?php echo "Γεια σας, είμαι ένα script της PHP!"; ?>

</body>

</html>

Προσέξτε πόσο διαφέρει από ένα CGI script που γράφεται σ’ άλλες γλώσσες, όπως η Perl ή η C, όπου αντί να γράψουμε ένα πρόγραμμα με πολλές εντολές για να δημιουργήσουμε κώδικα HTML, γράφουμε ένα HTML script με κάποιον ενσωματωμένο κώδικα για να κάνει κάτι, όπως στην συγκεκριμένη περίπτωση να εμφανίσει κάποιο κείμενο (μήνυμα). Ο κώδικας της PHP περικλείεται με ειδικά tags αρχής και τέλους για να μπορούμε να εισερχόμαστε και να εξερχόμαστε από το PHP mode.

Αυτό που ξεχωρίζει την PHP από μια γλώσσα όπως η  JavaScript, η οποία εκτελείται στην πλευρά του χρήστη (client-side), είναι ότι ο κώδικάς της εκτελείται στον server. Αν είχαμε σ’ έναν server ένα script παρόμοιο με το παραπάνω, ο χρήστης (client) θα λάμβανε το αποτέλεσμα της εκτέλεσης αυτού του script, χωρίς να είναι σε θέση να γνωρίζει ποιος μπορεί να είναι ο αρχικός κώδικας.

Μπορούμε ακόμη να ρυθμίσουμε (configure) τον web server ώστε να επεξεργάζεται όλα τα HTML αρχεία με την PHP και τότε δεν θα υπάρχει πράγματι κανένας τρόπος να μάθουν οι χρήστες τον κώδικά μας.

 

Τι Μπορεί να Κάνει η PHP

Στο πιο βασικό επίπεδο, η PHP μπορεί να κάνει ό,τι και τα άλλα προγράμματα της τεχνολογίας CGI, όπως επεξεργασία των δεδομένων μιας φόρμας, δημιουργία δυναμικού περιεχομένου ιστοσελίδων ή αποστολή και λήψη cookies.

Ίσως το δυνατότερο και πιο σημαντικό χαρακτηριστικό της PHP είναι η υποστήριξη που παρέχει σε μια ευρεία γκάμα από βάσεις δεδομένων. Έτσι, το να δημιουργήσουμε μια ιστοσελίδα που να παρέχει υποστήριξη σε βάσεις δεδομένων είναι απίστευτα απλό. Υποστηρίζει τις εξής βάσεις δεδομένων :

Adabas D

dBase

Empress

FilePro

Informix

InterBase

mSQL

MySQL

Oracle

PostgreSQL

Solid

Sybase

Velocis

Unix dbm

Η PHP παρέχει επίσης υποστήριξη για συνομιλία μ’ άλλες υπηρεσίες, χρησιμοποιώντας πρωτόκολλα όπως τα IMAP, SNMP, NNTP, POP3 ή και το HTTP.

 

Μια Σύντομη Ιστορία της PHP

Η ιδέα για την δημιουργία της PHP ελήφθη το φθινόπωρο του 1994 από τον Rasmus Lerdorf. Οι πρώτες ανεπίσημες εκδόσεις (versions) της PHP χρησιμοποιήθηκαν στην αρχική του σελίδα (home page) για να μπορεί να παρακολουθεί αυτούς που έμπαιναν στην σελίδα. Η πρώτη έκδοση που δόθηκε για χρήση στο κοινό ήταν διαθέσιμη στις αρχές του 1995 με το όνομα Personal Home Page Tools.

Αποτελείτο από μια πολύ απλοϊκή μηχανή ανάλυσης (parser engine) η οποία καταλάβαινε λίγες μόνο ειδικές μακροεντολές (macros) και έναν αριθμό από utilities που βρίσκονταν σε κοινή χρήση στις home pages εκείνη την εποχή. Ένα guestbook, ένας μετρητής (counter) και κάποιο άλλο υλικό. Ο αναλυτής (parser) ξαναγράφηκε στα μέσα του 1995 και ονομάστηκε PHP/FI Version 2.

Το όνομα FI προέρχεται από ένα άλλο πακέτο που είχε γράψει ο Rasmus και το οποίο διερμήνευε (interpreted) τα δεδομένα από φόρμες της HTML. Συνδύασε τα εργαλεία scripts της Personal Home Page με τον Form Interpreter και πρόσθεσε υποστήριξη για mSQL. Έτσι γεννήθηκε η PHP/FI, η οποία αναπτύχθηκε αλματωδώς και διάφοροι χρήστες άρχισαν να συνεισφέρουν κώδικα σ’ αυτήν.

Υπολογίζεται ότι μέχρι τα τέλη του 1996, η PHP/FI χρησιμοποιείτο σε τουλάχιστον 15.000 web sites σ’ όλον τον κόσμο και στα μέσα του 1997 αυτός ο αριθμός είχε ξεπεράσει τις 50.000. Στα μέσα του 1997 είχαμε επίσης μια αλλαγή στην ανάπτυξη της PHP.

Σταμάτησε να αποτελεί το αγαπημένο αντικείμενο του Rasmus και έγινε ο στόχος μιας πιο καλά οργανωμένης ομαδικής εργασίας. Ο αναλυτής (parser) ξαναγράφηκε από την αρχή από τους Zeev Suraski και Andi Gutmans και αυτός ο νέος parser αποτέλεσε τη βάση για την PHP Version 3. Ένα μεγάλο μέρος του utility code μεταφέρθηκε από την PHP/FI στην PHP3 και ένα μεγάλο μέρος του ξαναγράφηκε από την αρχή.

Σήμερα, η PHP/FI και η PHP3 έρχονται μ’ έναν αριθμό εμπορικών προϊόντων όπως ο web server C2 StrongHold και το RedHat Linux. Σύμφωνα με μια συντηρητική εκτίμηση, η PHP χρησιμοποιείται από περισσότερα από 150.000 sites σ’ όλον τον κόσμο.

 

Πώς να Ξεφύγουμε από την HTML

Υπάρχουν τέσσερις τρόποι για να μπορέσουμε να ξεφύγουμε από την HTML και να μπούμε στην μέθοδο συγγραφής κώδικα της PHP (PHP code mode) :

1ος τρόπος

<? echo ("Είναι η απλούστερη, μια εντολή επεξεργασίας SGML \n"); ?>

2ος τρόπος

<?php echo("Αν θέλουμε να εξυπηρετήσουμε XML έγγραφα \n"); ?>

3ος τρόπος

<script language="php">

echo ("Σε μερικούς editors, όπως ο FrontPage, δεν αρέσουν οι εντολές επεξεργασίας");

</script>

4ος τρόπος

<% echo ("Μπορούμε να χρησιμοποιήσουμε και tags με στυλ ASP"); %>

<%= $variable;       # Είναι μια συντόμευση για το "<%echo .." %>

Ο πρώτος τρόπος είναι διαθέσιμος μόνο αν έχουμε ενεργοποιήσει τα σύντομα (short) tags. Αυτό μπορεί να γίνει με τη συνάρτηση short_tags(), ενεργοποιώντας το short_open_tag configuration setting στο αρχείο config της PHP ή μεταγλωττίζοντας την PHP με την επιλογή --enable-short-tags option.

Ο τέταρτος τρόπος είναι διαθέσιμος μόνο αν έχουν ενεργοποιηθεί τα tags με στυλ ASP με το asp_tags configuration setting. Η υποστήριξη για τα ASP-style tags προστέθηκε στην έκδοση 3.0.4.

 

Τερματισμός Εντολών

        Οι εντολές στην PHP τερματίζονται με τον ίδιο τρόπο όπως στην C και την Perl, δηλ. μ’ έναν χαρακτήρα ; (semicolon). Μπορούμε, όμως, να δηλώσουμε το τέλος μιας εντολής και με το tag κλεισίματος (closing tag) ?>. Έτσι, τα παρακάτω είναι ισοδύναμα :

<?php

echo "This is a test";

?>

και

<?php echo "This is a test" ?>

 

Σχόλια (Comments)

Η PHP χρησιμοποιεί τον ίδιο τρόπο σχολιασμού όπως η C, η C++ και το Unix shell. Για παράδειγμα :

<?php

echo "Αυτή είναι μια δοκιμή"; // Σχόλιο μίας γραμμής της C++

/* Αυτό είναι ένα σχόλιο (comment) της C σε πολλές γραμμές

και αυτή είναι μια άλλη γραμμή σχολίου */

echo "Αυτή είναι άλλη μια δοκιμή";

echo "Μια τελική δοκιμή"; # Σχόλιο της shell

?>

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

<h1> Αυτό είναι ένα <?# echo "απλό";?> παράδειγμα. </h1>

<p> Το header θα εμφανίσει το 'Αυτό είναι ένα παράδειγμα.' </p>

Πρέπει να είμαστε προσεκτικοί για να μην φωλιάζουμε (nest) τα σχόλια τύπου C.

<?php

/*

echo "Αυτή είναι μια δοκιμή";

/* Αυτό το σχόλιο θα δημιουργήσει πρόβλημα */

*/

?>

 

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

Η PHP υποστηρίζει τους εξής τύπους δεδομένων :

Ο τύπος δεδομένων μιας μεταβλητής δεν ορίζεται συνήθως από τον προγραμματιστή αλλά αποφασίζεται την ώρα εκτέλεσης (runtime) από την PHP ανάλογα με το περιβάλλον (context) στο οποίο χρησιμοποιείται η μεταβλητή. Αν θέλουμε να κάνουμε μια μεταβλητή να μετατραπεί σ’ έναν συγκεκριμένο τύπο, μπορούμε είτε να μετατρέψουμε (cast) τη μεταβλητή ή να χρησιμοποιήσουμε τη συνάρτηση settype() σ’ αυτή.

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

 

Οι Ακέραιοι (Integers)

Οι ακέραιοι (integers) μπορούν να καθορισθούν χρησιμοποιώντας μια από τις εξής συντάξεις :

$a = 1234;    # δεκαδικός αριθμός

$a = -123;     # αρνητικός αριθμός

$a = 0123;    # οκταδικός αριθμός (ισοδύναμος με τον δεκαδικό 83)

$a = 0x12;     # δεκαεξαδικός αριθμός (ισοδύναμος με τον δεκαδ. 18)

 

Οι Αριθμοί Κινητοί Υποδιαστολής

Οι αριθμοί κινητής υποδιαστολής (floating point numbers ή doubles), μπορούν να καθορισθούν χρησιμοποιώντας μια από τις εξής συντάξεις :

$a = 1.234;

$a = 1.2e3;

 

Τα Αλφαριθμητικά (Strings)

Τα αλφαριθμητικά (strings) μπορούν να καθορισθούν χρησιμοποιώντας ένα από δύο σύνολα οριοθετών (delimiters). Αν το string περικλείεται από διπλά εισαγωγικά (double-quotes, "), οι μεταβλητές μέσα στο string θα επεκταθούν.

Όπως ισχύει στην C και την Perl, ο χαρακτήρας backslash (\) μπορεί να χρησιμοποιηθεί για να καθορίσουμε τους ειδικούς χαρακτήρες :

Ειδικός Χαρακτήρας

Νόημα

\n

Νέα γραμμή (newline)

\r

carriage

\t

Οριζόντιο tab (στηλοθέτης)

\\

Χαρακτήρας backslash

\$

Σύμβολο του δολαρίου

\"

Διπλά εισαγωγικά

\[0-7]{1,3}

Η σειρά των χαρακτήρων που ταιριάζει με την κανονική έκφραση είναι ένας χαρακτήρας του 8δικού συστήματος (octal notation)

\x[0-9A-Fa-f]{1,2}

Η σειρά των χαρακτήρων που ταιριάζει με την κανονική έκφραση είναι ένας χαρακτήρας του 16δικού συστήματος (hexadecimal notation)

Ο δεύτερος τρόπος για να οριοθετήσουμε (delimit) ένα string χρησιμοποιεί τον χαρακτήρα μονού εισαγωγικού (single-quote, '). Όταν ένα string περικλείεται από μονά εισαγωγικά, οι μόνοι ειδικοί χαρακτήρες (escapes) που γίνονται αντιληπτοί είναι οι \\ και \'. Οι μεταβλητές δεν επεκτείνονται (αναλύονται) μέσα σ’ ένα string που περικλείεται από μονά εισαγωγικά.

Ένας άλλος τρόπος για να οριοθετήσουμε strings είναι να χρησιμοποιήσουμε τη σύνταξη heredoc syntax (">>>"). Θα πρέπει να υπάρχει ένα αναγνωριστικό (identifier) μετά από το >>>, μετά το string και μετά το ίδιο αναγνωριστικό για να κλείσει. Ακολουθεί ένα παράδειγμα.

$str = >>>EOD

Παράδειγμα ενός string

που εκτείνεται σε πολλές γραμμές

χρησιμοποιώντας τη σύνταξη heredoc syntax.

EOD;

Τα strings μπορούν να ενωθούν (concatenated) με τον τελεστή '.' (dot), ενώ ο τελεστής της πρόσθεσης '+' δεν μπορεί να κάνει συνένωση.

Μπορούμε να έχουμε πρόσβαση στους χαρακτήρες των strings αντιμετωπίζοντας το string σαν έναν πίνακα χαρακτήρων, χρησιμοποιώντας μια σύνταξη που θυμίζει C. Ακολουθούν παραδείγματα.

<?php

/* Εκχώρηση ενός string */

$str = "This is a string";

/* Προσθήκη σ’ ένα string */

$str = $str . " with some more text";

/* Ένας άλλος τρόπος προσθήκης */

$str .= " and a newline at the end.\n";

/* Αυτό το string θα τελειώνει ως '<p> Number :  9 </p>' */

$num = 9;

$str = "<p> Number : $num </p>";

/* Και αυτό ως '<p> Number : $num </p>' */

$num = 9;

$str = '<p> Number : $num </p>';

/* Διαβάζουμε τον πρώτο χαρακτήρα ενός string */

$str = 'This is a test.';

$first = $str[0];

/* Διαβάζουμε τον τελευταίο χαρακτήρα ενός string */

$str = 'This is still a test.';

$last = $str[strlen($str)-1];

?>

 

Μετατροπή Strings

Όταν ένα string αποτιμάται σαν μια αριθμητική τιμή, η προκύπτουσα τιμή και ο τύπος δεδομένων καθορίζονται ως εξής : Το string θα αποτιμηθεί σε τύπο δεδομένων double αν περιέχει έναν από τους χαρακτήρες '.', 'e' ή 'E', αλλιώς θα αποτιμηθεί σαν ακέραιος (integer).

Η τιμή δίνεται από το αρχικό τμήμα του string. Αν το string ξεκινά με έγκυρα αριθμητικά δεδομένα, αυτή θα είναι και η τιμή που θα χρησιμοποιηθεί. Διαφορετικά, η τιμή του θα είναι 0.

Έγκυρα αριθμητικά δεδομένα σημαίνει ένα προαιρετικό πρόσημο, ακολουθούμενο από ένα ή περισσότερα ψηφία, και ίσως μια υποδιαστολή, ακολουθούμενα από έναν προαιρετικό εκθέτη. Ο εκθέτης είναι ένα 'e' ή 'E' ακολουθούμενος από ένα ή περισσότερα ψηφία.

Όταν η πρώτη έκφραση είναι ένα string, ο τύπος δεδομένων της μεταβλητής θα εξαρτηθεί από τη δεύτερη έκφραση.

$foo = 1 + "10.5";                            // $foo is double (11.5)

$foo = 1 + "-1.3e3";                        // $foo is double (-1299)

$foo = 1 + "bob-1.3e3";                 // $foo is integer (1)

$foo = 1 + "bob3";                          // $foo is integer (1)

$foo = 1 + "10 Small Pigs";           // $foo is integer (11)

$foo = 1 + "10 Little Piggies";      // $foo is integer (11)

$foo = "10.0 pigs " + 1;                  // $foo is integer (11)

$foo = "10.0 pigs " + 1.0;               // $foo is double (11)    

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

echo "\$foo==$foo; type is " . gettype($foo) . "<br>\n";

 

Πίνακες Μίας Διάστασης (Single Dimension Arrays)

Οι πίνακες (arrays) ενεργούν και σαν πίνακες hash (associative arrays) και σαν δεικτοδοτούμενοι πίνακες (indexed arrays) ή διανύσματα (vectors).

Η PHP υποστηρίζει και τους scalar και τους associative πίνακες. Στην πραγματικότητα, δεν υπάρχει καμία διαφορά ανάμεσά τους. Μπορούμε να δημιουργήσουμε έναν πίνακα με τις συναρτήσεις list() ή array() ή μπορούμε να ορίσουμε την τιμή κάθε στοιχείου του πίνακα, ως εξής :

$a[0] = "abc";

$a[1] = "def";

$b["foo"] = 13;

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

$a[] = "hello";         // $a[2] == "hello"

$a[] = "world";        // $a[3] == "world"

Μπορούμε να ταξινομήσουμε τους πίνακες με τις συναρτήσεις asort(), arsort(), ksort(), rsort(), sort(), uasort(), usort() και uksort(), ανάλογα με τον τύπο της ταξινόμησης που θέλουμε να κάνουμε.

Μπορούμε να μετρήσουμε τον αριθμό των στοιχείων ενός πίνακα με τη συνάρτηση count() και μπορούμε να διασχίσουμε έναν πίνακα με τις συναρτήσεις next() και prev() ή με τη συνάρτηση each().

 

Πίνακες Πολλών Διαστάσεων (Multi-Dimension Arrays)

Οι πίνακες πολλών διαστάσεων είναι αρκετά απλοί. Για κάθε διάσταση (dimension) του πίνακα, προσθέτουμε μια τιμή [key]. Ακολουθούν παραδείγματα.

$a[1] = $f;                        # Πίνακες μίας διάστασης

$a["foo"] = $f;  

$a[1][0] = $f;                  # Πίνακες δύο διαστάσεων

$a["foo"][2] = $f;           # Μπορούμε να αναμείξουμε αριθμητικούς

$a[3]["bar"] = $f;           # και associative δείκτες (indices)

$a["foo"][4]["bar"][0] = $f;        # Πίνακας τεσσάρων διαστάσεων

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

$a[3]['bar'] = 'Bob';

echo "Αυτό δεν θα δουλέψει : $a[3][bar]";

Στην PHP3, το παραπάνω θα δημιουργήσει την έξοδο Αυτό δεν θα δουλέψει : Array[bar]. Ο τελεστής ένωσης string, όμως, μπορεί να χρησιμοποιηθεί για να το ξεπεράσουμε αυτό :

$a[3]['bar'] = 'Bob';

echo "Αυτό θα δουλέψει : " . $a[3][bar];

Στην PHP4, όμως, μπορούμε να παρακάμψουμε αυτό το πρόβλημα αν περικλείσουμε την αναφορά στον πίνακα (μέσα στο string) με άγκιστρα, ως εξής :

$a[3]['bar'] = 'Bob';

echo "Αυτό θα δουλέψει : {$a[3][bar]}";

Μπορούμε να καταχωρήσουμε στοιχεία σε πίνακες με πολλούς τρόπους. Τα δύο επόμενα παραδείγματα γεμίζουν έναν πίνακα μίας διάστασης με τα ίδια στοιχεία :

# Παράδειγμα 1 :

$a["color"]   = "red";

$a["taste"]    = "sweet";

$a["shape"]  = "round";

$a["name"]   = "apple";

$a[3]              = 4;

# Παράδειγμα 2 :

$a = array(

     "color" => "red",

     "taste" => "sweet",

     "shape" => "round",

     "name"  => "apple",

     3       => 4

);

Μπορούμε να φωλιάσουμε (nest) τη συνάρτηση array() για πίνακες πολλαπλών διαστάσεων :

<?

$a = array(

     "apple"  => array(

          "color"  => "red",

          "taste"  => "sweet",

          "shape"  => "round"

     ),

     "orange"  => array(

          "color"  => "orange",

          "taste"  => "tart",

          "shape"  => "round"

     ),

     "banana"  => array(

          "color"  => "yellow",

          "taste"  => "paste-y",

          "shape"  => "banana-shaped"

     )

);

echo $a["apple"]["taste"];    # Θα δώσει το αποτέλεσμα "sweet"

?>

 

Τα Αντικείμενα (Objects)

Για να αρχικοποιήσουμε (initialize) ένα αντικείμενο (object), χρησιμοποιούμε την εντολή new για να δημιουργήσουμε μια μεταβλητή από το αντικείμενο.

class foo {

function do_foo () {

echo "Doing foo.";

}

}

$bar = new foo;

$bar->do_foo();

 

Κόλπα με τους Τύπους Δεδομένων (Type Juggling)

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

Αυτό σημαίνει ότι αν εκχωρήσουμε μια τιμή string σε μια μεταβλητή var, η var θα γίνει ένα string και αν αργότερα εκχωρήσουμε μια ακέραια τιμή στην var, αυτή θα γίνει ακέραια (integer).

Ένα παράδειγμα της αυτόματης μετατροπής τύπου στην PHP είναι ο τελεστής πρόσθεσης +. Αν κάποιος από τους τελεστέους (operands) είναι μια τιμή double, τότε όλοι οι τελεστέοι εκτιμούνται σαν τύπου doubles και το αποτέλεσμα θα είναι τύπου double.

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

$foo = "0";                                        // $foo is string (ASCII 48)

$foo++;                                             // $foo is the string "1" (ASCII 49)

$foo += 1;                                         // $foo is now an integer (2)

$foo = $foo + 1.3;                            // $foo is now a double (3.3)

$foo = 5 + "10 Little Piggies";      // $foo is integer (15)

$foo = 5 + "10 Small Pigs";           // $foo is integer (15)

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

echo "\$foo==$foo; type is " . gettype( $foo ) . "<br>\n";

 

Η Μετατροπή Τύπων (Type Casting)

Η μετατροπή τύπων (type casting) στην PHP εργάζεται όπως και στην C : το όνομα του επιθυμητού τύπου γράφεται μέσα σε παρενθέσεις πριν από τη μεταβλητή η οποία θα μετατραπεί.

$foo = 10;                             // Το $foo είναι τύπου integer

$bar = (double) $foo;          // Το $bar είναι τύπου double

Οι μετατροπές (casts) που επιτρέπονται είναι οι εξής :

(int), (integer) - cast to integer

(real), (double), (float) - cast to double

(string) - cast to string

(array) - cast to array

(object) - cast to object

Μπορεί να υπάρχουν κενά και tabs μέσα στις παρενθέσεις :

$foo = (int) $bar;

$foo = ( int ) $bar;

Όταν κάνουμε μετατροπή από μια μεταβλητή scalar ή string σ’ έναν πίνακα (array), η μεταβλητή θα γίνει το πρώτο στοιχείο του πίνακα :

$var = 'ciao';

$arr = (array) $var;

echo $arr[0];                        // εμφανίζει 'ciao'

Όταν κάνουμε μετατροπή από μια μεταβλητή scalar ή string σ’ ένα αντικείμενο (object), η μεταβλητή θα γίνει μια ιδιότητα (attribute) του αντικειμένου και το όνομα (name) της ιδιότητας θα είναι τύπου scalar :

$var = 'ciao';

$obj = (object) $var;

echo $obj->scalar;  // εμφανίζει 'ciao'

 

Οι Μεταβλητές (Variables)

Οι μεταβλητές (variables) στην PHP παριστάνονται από το σύμβολο $ ακολουθούμενο από το όνομα της μεταβλητής. Τα ονόματα των μεταβλητών ξεχωρίζουν τα πεζά από τα κεφαλαία γράμματα (case-sensitive).

$var = "Bob";

$Var = "Joe";

echo "$var, $Var";   // εμφανίζει "Bob, Joe"

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

Η PHP4 προσφέρει και έναν άλλον τρόπο για να εκχωρήσουμε τιμές σε μεταβλητές : με αναφορά (by reference), δηλ. η νέα μεταβλητή αναφέρεται (references) ή αποτελεί ένα ψευδώνυμο (alias) ή δείχνει (points) στην αρχική μεταβλητή.

Οι αλλαγές στη νέα μεταβλητή επηρεάζουν και την αρχική και το αντίστροφο. Για να κάνουμε εκχώρηση με αναφορά, τοποθετούμε το σύμβολο & (ampersand) πριν από την αρχική μεταβλητή. Για παράδειγμα, ο επόμενος κώδικας εμφανίζει δύο φορές το μήνυμα 'My name is Bob' :

<?php

$foo = 'Bob';                                     // Εκχώρηση της τιμής 'Bob' στην $foo

$bar = &$foo;                                  // Αναφορά στην $foo μέσω της $bar.

$bar = "My name is $bar";            // Η $bar αλλάζει

echo $foo;                                         // Η $foo αλλάζει επίσης

echo $bar;

?>

Κάτι σημαντικό που πρέπει να σημειώσουμε είναι ότι μόνο ονοματισμένες μεταβλητές (named variables) μπορούν να εκχωρηθούν με αναφορά (by reference).

<?php

$foo = 25;

$bar = &$foo;          // Έγκυρη εκχώρηση

$bar = &(24 * 7);     // Μη έγκυρη εκχώρηση

function test() {

return 25;

}

$bar = &test();         // Μη έγκυρη

?>

 

Οι Προκαθορισμένες Μεταβλητές

Η PHP παρέχει έναν μεγάλο αριθμό από προκαθορισμένες μεταβλητές (predefined variables) σ’ οποιοδήποτε script εκτελεί. Όμως, πολλές απ’ αυτές τις μεταβλητές δεν μπορούν να τεκμηριωθούν πλήρως (documented) γιατί εξαρτώνται από τον server στον οποίον εκτελούνται, την έκδοση (version) και την ρύθμιση (setup) του server καθώς και από άλλους παράγοντες.

Παρ’ όλα αυτά, θα δούμε μια λίστα από προκαθορισμένες μεταβλητές που είναι διαθέσιμες σε μια εγκατάσταση της PHP 3 που εκτελείται σαν ένα module σε μια εγκατάσταση του Apache 1.3.6.

 

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

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

GATEWAY_INTERFACE

Ποια αναθεώρηση (revision) της προδιαγραφής CGI χρησιμοποιεί ο server, όπως π.χ. CGI/1.1.

SERVER_NAME

Το όνομα του server host στον οποίο εκτελείται το τρέχον script. Μπορεί να είναι και το όνομα ενός εικονικού (virtual) host.

SERVER_SOFTWARE

Το string αναγνώρισης του server (server identification string), το οποίο δίνεται στις επικεφαλίδες (headers) όταν ο server απαντάει σε αιτήσεις (requests).

SERVER_PROTOCOL

Το όνομα (name) και η αναθεώρηση (revision) του πρωτοκόλλου πληροφοριών (information protocol) μέσω του οποίου ζητήθηκε η σελίδα, δηλ. HTTP/1.0.

REQUEST_METHOD

Ποια μέθοδος αίτησης (request method) χρησιμοποιήθηκε για να έχουμε πρόσβαση στη σελίδα, δηλ. GET, HEAD, POST, PUT.

QUERY_STRING

Το query string, αν υπάρχει, μέσω του οποίου έχουμε πρόσβαση στη σελίδα.

DOCUMENT_ROOT

Το document root directory στο οποίο εκτελείται το τρέχον script, όπως ορίζεται στο αρχείο σύνθεσης (configuration file) του server.

HTTP_ACCEPT

Τα περιεχόμενα του Accept : η επικεφαλίδα (header) της τρέχουσας αίτησης (request), αν υπάρχει κάποια.

HTTP_ACCEPT_CHARSET

Τα περιεχόμενα του Accept-Charset : η επικεφαλίδα (header) της τρέχουσας αίτησης (request), αν υπάρχει κάποια. Παράδειγμα : iso-8859-1,*,utf-8'.

HTTP_ENCODING

Τα περιεχόμενα του Accept-Encoding : η επικεφαλίδα (header) της τρέχουσας αίτησης (request), αν υπάρχει κάποια. Παράδειγμα : gzip.

HTTP_ACCEPT_LANGUAGE

Τα περιεχόμενα του Accept-Language : η επικεφαλίδα (header) της τρέχουσας αίτησης (request), αν υπάρχει κάποια. Παράδειγμα : en.

HTTP_CONNECTION

Τα περιεχόμενα του Connection : η επικεφαλίδα (header) της τρέχουσας αίτησης (request), αν υπάρχει κάποια. Παράδειγμα : Keep-Alive.

HTTP_HOST

Τα περιεχόμενα του Host : η επικεφαλίδα (header) της τρέχουσας αίτησης (request), αν υπάρχει κάποια.

HTTP_REFERER

Η διεύθυνση της σελίδας, αν υπάρχει, η οποία έφερε τον φυλλομετρητή στην τρέχουσα σελίδα.

HTTP_USER_AGENT

Τα περιεχόμενα του User_Agent : η επικεφαλίδα (header) της τρέχουσας αίτησης (request), αν υπάρχει κάποια. Αυτό το string φανερώνει το λογισμικό του φυλλομετρητή που χρησιμοποιείται για να δούμε την τρέχουσα σελίδα, όπως π.χ. Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586). Μπορούμε να χρησιμοποιήσουμε αυτήν την τιμή με τη συνάρτηση get_browser() για να προσαρμόσουμε τη λειτουργικότητα της σελίδας μας σύμφωνα με τις δυνατότητες του φυλλομετρητή του χρήστη.

REMOTE_ADDR

Η IP διεύθυνση από την οποία βλέπει ο χρήστης την τρέχουσα σελίδα.

REMOTE_PORT

Η θύρα (port) που χρησιμοποιείται στο μηχάνημα του χρήστη για να επικοινωνήσει με τον web server.

SCRIPT_FILENAME

Η απόλυτη διαδρομή (pathname) του τρέχοντος εκτελούμενου script.

SERVER_ADMIN

Η τιμή που δίνεται στην οδηγία (directive) SERVER_ADMIN (για τον Apache) στο αρχείο σύνθεσης (configuration file) του web server.

SERVER_PORT

Η θύρα (port) στο μηχάνημα του server που χρησιμοποιείται από τον web server για επικοινωνία. Στις προκαθορισμένες ρυθμίσεις, έχει την τιμή 80, ενώ αν χρησιμοποιούμε το SSL, για παράδειγμα, θα αλλάξει σ’ ο,τιδήποτε είναι η δική μας ορισμένη ασφαλής θύρα HTTP.

SERVER_SIGNATURE

Ένα string που περιέχει την έκδοση (version) του server και το virtual host name, τα οποία προστίθενται στις παραγόμενες από τον server σελίδες, αν είναι ενεργοποιημένες.

SCRIPT_NAME

Περιέχει τη διαδρομή (path) του τρέχοντος script. Είναι χρήσιμη για σελίδες που πρέπει να δείχνουν στον εαυτό τους.

REQUEST_URI

Το URI που δόθηκε για να μπορούμε να έχουμε πρόσβαση στη σελίδα, όπως π.χ. /index.html.

 

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

Αυτές οι μεταβλητές δημιουργούνται από την ίδια την PHP.

argv

Είναι ένας πίνακας (array) από τα ορίσματα (arguments) που μεταβιβάζονται στο script. Όταν το script εκτελείται από τη γραμμή εντολών, αυτό μας δίνει μια πρόσβαση στις παραμέτρους της γραμμής εντολών, κάτι που θυμίζει την C. Όταν καλείται μέσω της μεθόδου GET, η μεταβλητή αυτή θα περιέχει το query string.

argc

Περιέχει τον αριθμό των παραμέτρων της γραμμής εντολών που μεταβιβάζονται στο script, αν αυτό εκτελείται από τη γραμμή εντολών βέβαια.

PHP_SELF

Το όνομα αρχείου (filename) του τρέχοντα εκτελούμενου script. Αν το PHP εκτελείται σαν ένας επεξεργαστής από τη γραμμή εντολών, αυτή η μεταβλητή δεν είναι διαθέσιμη.

HTTP_COOKIE_VARS

Ένας associative πίνακας (array) από μεταβλητές που μεταβιβάζονται στο τρέχον script μέσω HTTP cookies.

HTTP_GET_VARS

Ένας associative πίνακας (array) από μεταβλητές που μεταβιβάζονται στο τρέχον script μέσω της μεθόδου HTTP GET.

HTTP_POST_VARS

Ένας associative πίνακας (array) από μεταβλητές που μεταβιβάζονται στο τρέχον script μέσω της μεθόδου HTTP POST.

 

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

Η εμβέλεια (scope) μιας μεταβλητής είναι το περιβάλλον (context) μέσα στο οποίο ορίζεται. Οι περισσότερες από τις PHP μεταβλητές έχουν μία μόνο περιοχή εμβέλειας. Για παράδειγμα :

$a = 1;

include "b.inc";

Εδώ, η μεταβλητή $a θα είναι διαθέσιμη μέσα στο συμπεριλαμβανόμενο (included) b.inc script. Όμως, στις οριζόμενες από τον προγραμματιστή συναρτήσεις (user-defined functions) υπάρχει μια τοπική εμβέλεια. Μια μεταβλητή που χρησιμοποιείται μέσα σε μια συνάρτηση είναι εξ ορισμού περιορισμένη στην τοπική εμβέλεια αυτής της συνάρτησης. Για παράδειγμα :

$a = 1;                       /* καθολική εμβέλεια */

Function Test () {

echo $a;         /* αναφέρεται στην τοπική μεταβλητή */

}

Test ();

Αυτό το script δεν θα εμφανίσει κάποια έξοδο επειδή η εντολή echo αναφέρεται σε μια τοπική μεταβλητή (local variable) $a, η οποία δεν έχει αποκτήσει τιμή μέσα στην εμβέλειά της. Αυτό είναι διαφορετικό από τη γλώσσα C στο ότι οι καθολικές μεταβλητές (global variables) της C είναι αυτόματα διαθέσιμες στις συναρτήσεις εκτός κι αν επικαλύπτονται σαφώς από μια τοπική δήλωση.

Αυτό μπορεί να προκαλέσει προβλήματα στο ότι μπορεί κάποιος άθελά του να αλλάξει μια καθολική μεταβλητή. Στην PHP οι καθολικές μεταβλητές πρέπει να δηλωθούν σαν global μέσα σε μια συνάρτηση αν πρόκειται να τις χρησιμοποιήσουμε μέσα σ’ αυτή τη συνάρτηση. Ακολουθεί ένα παράδειγμα :

$a = 1;

$b = 2;

Function Sum () {

global $a, $b;

$b = $a + $b;

}

Sum ();

echo $b;

Το παραπάνω script θα εμφανίσει το 3. Δηλώνοντας τις $a και $b σαν global μέσα στη συνάρτηση, όλες οι αναφορές και στις δύο μεταβλητές θα αφορούν τις καθολικές τιμές. Δεν υπάρχει κάποιος περιορισμός στον αριθμό των καθολικών μεταβλητών που μπορεί να χειριστεί μια συνάρτηση.

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

$a = 1;

$b = 2;

Function Sum () {

$GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"];

}

Sum ();

echo $b;

Ο πίνακας $GLOBALS είναι ένας associative πίνακας με το όνομα της καθολικής μεταβλητής να αποτελεί το key και τα περιεχόμενα αυτής της μεταβλητής να αποτελούν την τιμή του στοιχείου του πίνακα.

Ένα άλλο σημαντικό χαρακτηριστικό είναι οι στατικές μεταβλητές. Μια στατική μεταβλητή (static variable) υπάρχει μόνο στην τοπική εμβέλεια μιας συνάρτησης αλλά δεν χάνει την τιμή της όταν η εκτέλεση του προγράμματος εγκαταλείπει τη συνάρτηση. Ας δούμε το επόμενο παράδειγμα :

Function Test () {

$a = 0;

echo $a;

$a++;

}

Αυτή η συνάρτηση δεν είναι και τόσο χρήσιμη εφόσον κάθε φορά που καλείται καταχωρεί στο $a το 0 και εκτυπώνει το "0". Η εντολή $a++, η οποία αυξάνει την τιμή της μεταβλητής, δεν κάνει τίποτα εφόσον μόλις τελειώνει η συνάρτηση, εξαφανίζεται η μεταβλητή $a.

Για να δημιουργήσουμε μια χρήσιμη συνάρτηση μέτρησης η οποία δεν θα χάνει τον έλεγχο της τρέχουσας μέτρησης, θα πρέπει να δηλώσουμε τη μεταβλητή $a σαν static :

Function Test () {

static $a = 0;

echo $a;

$a++;

}

Τώρα, κάθε φορά που καλείται η συνάρτηση Test(), θα εκτυπώνει την τιμή της $a και θα την αυξάνει.

Οι στατικές μεταβλητές παρέχουν επίσης έναν τρόπο για να ασχοληθούμε τις αναδρομικές συναρτήσεις. Μια αναδρομική συνάρτηση (recursive function) είναι αυτή που καλεί τον εαυτό της. Η επόμενη συνάρτηση μετράει αναδρομικά έως το 10 και χρησιμοποιεί τη στατική μεταβλητή $count για να ξέρει πότε να σταματήσει :

Function Test () {

static $count = 0;

$count++;

echo $count;

if ($count < 10) {

Test ();

}

$count- -;

}

 

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

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

$a = "hello";

Μια μεταβλητή μεταβλητή αποκτά την τιμή μιας μεταβλητής και την αντιμετωπίζει σαν το όνομα μιας μεταβλητής. Στο παραπάνω παράδειγμα, το hello, μπορεί να χρησιμοποιηθεί σαν το όνομα μιας μεταβλητής χρησιμοποιώντας δύο σύμβολα $, ως εξής :

$$a = "world";

Σ’ αυτό το σημείο έχουμε ορίσει δύο μεταβλητές και τις έχουμε αποθηκεύσει στο συμβολικό δένδρο της PHP : η $a με περιεχόμενο "hello" και η $hello με περιεχόμενο "world". Συνεπώς, η επόμενη εντολή :

echo "$a ${$a}";

παράγει την ίδια ακριβώς έξοδο με την :

echo "$a $hello";

Δηλαδή και οι δύο παράγουν το : hello world.

Για να μπορέσουμε να χρησιμοποιήσουμε μεταβλητές μεταβλητές με πίνακες (arrays), θα πρέπει να λύσουμε ένα πρόβλημα ασάφειας. Δηλαδή, αν γράψουμε $$a[1], τότε ο αναλυτής (parser) θα πρέπει να γνωρίζει αν σκοπεύαμε να χρησιμοποιήσουμε το $a[1] σαν μια μεταβλητή ή αν θέλαμε να είναι το $$a η μεταβλητή και μετά το [1] ο δείκτης (index) απ’ αυτή τη μεταβλητή. Η σύνταξη για να επιλύσουμε αυτήν την αμφιβολία είναι : ${$a[1]} για την πρώτη περίπτωση και ${$a}[1] για τη δεύτερη.

 

Μεταβλητές Εκτός της PHP

Όταν υποβάλλεται μια φόρμα σ’ ένα PHP script, όλες οι μεταβλητές αυτής της φόρμας γίνονται αυτόματα διαθέσιμες στο script από την PHP. Για παράδειγμα, ας δούμε την εξής φόρμα :

<form action="foo.php3" method="post">

Όνομα : <input type="text" name="name"><br>

<input type="submit">

</form>

Όταν υποβληθεί η φόρμα, η PHP θα δημιουργήσει μια μεταβλητή με όνομα $name, η οποία θα περιέχει την τιμή που καταχωρήθηκε στο πεδίο name της φόρμας.

Η PHP καταλαβαίνει επίσης τους πίνακες στο περιβάλλον των μεταβλητών φόρμας αλλά μόνο σε μία διάσταση. Μπορούμε, για παράδειγμα, να ομαδοποιήσουμε σχετικές μεταβλητές μαζί ή να χρησιμοποιήσουμε αυτό το χαρακτηριστικό για να ανακτήσουμε τιμές από μια λίστα πολλαπλής επιλογής (multiple select input) :

<form action="array.php" method="post">

Όνομα : <input type="text" name="personal[name]"><br>

Email : <input type="text" name="personal[email]"><br>

Μπύρα : <br>

<select multiple name="beer[]">

<option value="Fix"> Fix

<option value="Heineken"> Heineken

<option value="Pilsen"> Pilsen

</select>

<input type="submit">

</form>

Αν το χαρακτηριστικό track_vars της PHP είναι ενεργοποιημένο, είτε με τη ρύθμιση σύνθεσης (configuration setting) track_vars ή με την οδηγία (directive) <?php_track_vars?>, τότε οι μεταβλητές που υποβάλλονται με τις μεθόδους POST ή GET θα βρίσκονται επίσης στους global associative πίνακες (arrays) $HTTP_POST_VARS και $HTTP_GET_VARS.

 

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

Όταν υποβάλλουμε μια φόρμα, μπορούμε να χρησιμοποιήσουμε μια εικόνα (image) αντί για το στάνταρτ πλήκτρο submit, μ’ ένα tag σαν το :

<input type=image src="image.gif" name="sub">

Όταν ο χρήστης κάνει κλικ κάπου πάνω στην εικόνα, η φόρμα θα σταλεί στον server με δύο επιπλέον μεταβλητές, τις sub_x και sub_y, οι οποίες περιέχουν τις συντεταγμένες (coordinates) του κλικ που έκανε ο χρήστης μέσα στην εικόνα.

 

Τα HTTP Cookies

Η PHP υποστηρίζει τα HTTP cookies όπως ορίζεται από τις προδιαγραφές της Netscape. Τα cookies είναι ένας μηχανισμός για να αποθηκεύονται δεδομένα στον απομακρυσμένο φυλλομετρητή και έτσι να μπορούμε να παρακολουθούμε ή να αναγνωρίζουμε τους χρήστες. Μπορούμε να ορίσουμε τα cookies με τη συνάρτηση SetCookie().

Τα cookies αποτελούν μέρος του HTTP header, έτσι η συνάρτηση SetCookie() πρέπει να κληθεί πριν σταλεί κάποια έξοδος στον φυλλομετρητή. Αυτός είναι ο ίδιος περιορισμός που ισχύει και για τη συνάρτηση Header(). Τα cookies που στέλνονται σε μας από τον client θα μετατραπούν αυτόματα σε μια μεταβλητή της PHP όπως συμβαίνει με τα δεδομένα των μεθόδων GET και POST.

Αν θελήσουμε να εκχωρήσουμε πολλαπλές τιμές σ’ ένα μόνο cookie, απλά προσθέτουμε τα σύμβολα [ ] στο όνομα του cookie, ως εξής :

SetCookie ("MyCookie[]", "Testing", time()+3600);

Ένα cookie θα αντικαταστήσει ένα ήδη υπάρχον με το ίδιο όνομα στον φυλλομετρητή μας εκτός κι αν διαφέρουν η διαδρομή (path) ή το domain. Έτσι, για μια εφαρμογή shopping cart μπορεί να θέλουμε να έχουμε έναν μετρητή (counter) και να το μεταβιβάσουμε αυτό ως εξής :

$Count++;

SetCookie ("Count", $Count, time()+3600);

SetCookie ("Cart[$Count]", $item, time()+3600);

 

Οι Μεταβλητές Περιβάλλοντος (Environment)

Η PHP κάνει αυτόματα διαθέσιμες τις μεταβλητές περιβάλλοντος ( environment) σαν κανονικές PHP μεταβλητές.

echo $HOME;

/* Δείχνει τη μεταβλητή environment HOME, αν έχει ορισθεί */

Εφόσον οι πληροφορίες που έρχονται μέσω των μηχανισμών GET, POST και Cookie δημιουργούν επίσης αυτόματα μεταβλητής PHP, είναι μερικές φορές καλύτερο να διαβάσουμε ρητά μια μεταβλητή από το environment για να είμαστε σίγουροι ότι λαμβάνουμε τη σωστή έκδοση.

Η συνάρτηση getenv() μπορεί να χρησιμοποιηθεί γι’ αυτόν τον σκοπό. Μπορούμε επίσης να ορίσουμε μια μεταβλητή environment με τη συνάρτηση putenv().

 

Οι Τελείες (Dots) στις Εισερχόμενες Μεταβλητές

Τυπικά, η PHP δεν αλλάζει τα ονόματα των μεταβλητών όταν αυτά μεταβιβάζονται σ’ ένα script. Όμως, θα πρέπει να σημειωθεί ότι η τελεία (dot) δεν αποτελεί έναν έγκυρο χαρακτήρα σ’ ένα όνομα μεταβλητής της PHP, ως εξής :

$varname.ext;                       /* μη έγκυρο όνομα μεταβλητής */

Τώρα, αυτό που βλέπει ο αναλυτής (parser) είναι μια μεταβλητή με όνομα $varname ακολουθούμενη από τον τελεστή ένωσης string και από το ext που δεν ταιριάζει με κάποια γνωστή λέξη κλειδί.

Γι’ αυτόν τον λόγο, είναι σημαντικό να σημειώσουμε ότι η PHP αντικαθιστά αυτόματα τις τελείες στα εισερχόμενα ονόματα μεταβλητών με τον χαρακτήρα _ (underscore).

 

Καθορισμός των Τύπων Μεταβλητών

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

Η PHP περιέχει αρκετές συναρτήσεις που μπορούμε να χρησιμοποιήσουμε για να βρούμε τον τύπο δεδομένων μιας μεταβλητής. Αυτές είναι οι gettype(), is_long(), is_double(), is_string(), is_array() και is_object().

 

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

Η PHP ορίζει αρκετές σταθερές (constants) και παρέχει έναν μηχανισμό για να ορίσουμε περισσότερες κατά την ώρα εκτέλεσης (run-time). Οι σταθερές είναι σαν τις μεταβλητές, εκτός από το ότι πρέπει να ορισθούν με τη συνάρτηση define() και ότι δεν μπορούν να ξαναορισθούν αργότερα σε μια άλλη τιμή.

Οι προκαθορισμένες σταθερές, οι οποίες είναι πάντα διαθέσιμες, είναι οι εξής :

__FILE__

Το όνομα του αρχείου script που αναλύεται (parsed) αυτή τη στιγμή. Αν χρησιμοποιείται μέσα σ’ ένα αρχείο το οποίο έχει συμπεριληφθεί (included), τότε δίνεται το όνομα του αρχείου που έχει συμπεριληφθεί και όχι το όνομα του πατρικού αρχείου (parent file).

__LINE__

Ο αριθμός της γραμμής μέσα στο τρέχον αρχείο script που αναλύεται (parsed). Αν χρησιμοποιείται μέσα σ’ ένα αρχείο το οποίο έχει συμπεριληφθεί (included), τότε δίνεται η θέση μέσα στο αρχείο που έχει συμπεριληφθεί.

PHP_VERSION

Η αναπαράσταση σε string της έκδοσης (version) του PHP parser που χρησιμοποιείται εκείνη τη στιγμή, όπως π.χ. '3.0.8-dev'.

PHP_OS

Το όνομα του λειτουργικού συστήματος στο οποίο εκτελείται ο PHP parser, όπως π.χ. 'Linux'.

TRUE

Μια τιμή true.

FALSE

Μια τιμή false.

E_ERROR

Δηλώνει ένα λάθος (error) διαφορετικό από ένα parsing error από το οποίο είναι αδύνατη η ανάκαμψη (recovery).

E_WARNING

Δηλώνει μια συνθήκη όπου η PHP γνωρίζει ότι κάτι είναι λάθος αλλά συνεχίζει έτσι κι αλλιώς. Ένα παράδειγμα μπορεί να είναι μια μη έγκυρη κανονική έκφραση στην ereg().

E_PARSE

Ο parser σταμάτησε λόγω μη έγκυρης σύνταξης στο αρχείο script και η ανάκαμψη (recovery) είναι αδύνατη.

E_NOTICE

Κάτι συνέβη που μπορεί να είναι ένα λάθος (error) ή όχι. Η εκτέλεση συνεχίζεται. Τέτοια παραδείγματα μπορεί να είναι η χρήση ενός string χωρίς εισαγωγικά σαν hash index ή η χρήση μιας μεταβλητής που δεν έχει ορισθεί ακόμη.

 

Οι σταθερές του τύπου E_* χρησιμοποιούνται συνήθως με τη συνάρττηση error_reporting() για να ορίσουμε το επίπεδο αναφοράς λάθους (error reporting level). Μπορούμε να ορίσουμε επιπλέον μεταβλητές με τη συνάρτηση define().

Πρέπει να έχουμε υπόψη μας ότι αυτές είναι μεταβλητές και όχι μακροεντολές της C (C-style macros) και συνεπώς μόνο έγκυρα αριθμητικά δεδομένα (scalar data) μπορούν να παριστάνονται από μια μεταβλητή.

            Ακολουθεί ένα παράδειγμα με ορισμό σταθεράς.

<?php

define("CONSTANT", "Hello world.");

echo CONSTANT;                 // εμφανίζει το "Hello world."

?>

Ακολουθεί ένα παράδειγμα με χρήση των προκαθορισμένων σταθερών __FILE__ και __LINE__.

<?php

function report_error($file, $line, $message) {

echo "An error occured in $file on line $line : $message.";

}

report_error(__FILE__,__LINE__, "Something went wrong!");

?>

 

Οι Εκφράσεις (Expressions)

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

Οι βασικότερες μορφές εκφράσεων είναι οι σταθερές (constants) και οι μεταβλητές (variables). Για παράδειγμα, όταν γράφουμε $a = 5, εκχωρούμε το 5 στο $a. Το 5 είναι μια έκφραση (expression) με την τιμή 5 και σ’ αυτήν την περίπτωση το 5 είναι μια ακέραια σταθερά.

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

Λίγο περισσότερα σύνθετα παραδείγματα για τις εκφράσεις είναι οι συναρτήσεις (functions), όπως για παράδειγμα η ακόλουθη συνάρτηση :

function foo () {

return 5;

}

Οι συναρτήσεις είναι εκφράσεις με την τιμή της τιμής επιστροφής τους (return value). Έτσι, εφόσον η συνάρτηση foo() επιστρέφει το 5, η τιμή της έκφρασης foo() είναι 5. Συνήθως, βέβαια οι συναρτήσεις δεν επιστρέφουν απλά μια στατική τιμή αλλά κάνουν και υπολογισμούς.

Η PHP υποστηρίζει τους εξής τρεις τύπους τιμών scalar : ακέραιες τιμές (integer), τιμές κινητής υποδιαστολής (floating point) και αλφαριθμητικές τιμές (string) values. Οι τιμές scalar είναι τιμές που δεν μπορούμε να διασπάσουμε σε μικρότερα κομμάτια, σ’ αντίθεση με τους πίνακες (arrays), για παράδειγμα.

Η PHP υποστηρίζει επίσης δύο σύνθετους (composite, non-scalar) τύπους : τους πίνακες (arrays) και τα αντικείμενα (objects). Ο καθένας απ’ αυτούς τους τύπους τιμών μπορεί να εκχωρηθεί σε μεταβλητές ή να επιστραφεί από συναρτήσεις.

Η PHP αντιμετωπίζει τις εκφράσεις με τον ίδιο τρόπο που τις αντιμετωπίζουν πολλές από τις υπόλοιπες γλώσσες. Η PHP είναι μια προσανατολισμένη σε εκφράσεις (expression-oriented) γλώσσα, με την έννοια ότι σχεδόν ο,τιδήποτε αποτελεί μια έκφραση.

Στο παράδειγμα που είδαμε προηγουμένως, το $a = 5 είναι μια έκφραση που έχει την τιμή 5. Έτσι, το να γράψουμε κάτι σαν το $b = ($a = 5) είναι το ίδιο με το να γράψουμε $a = 5; $b = 5;. Εφόσον οι εκχωρήσεις γίνονται από δεξιά προς τα αριστερά, μπορούμε να γράψουμε επίσης $b = $a = 5.

Ένα άλλο καλό παράδειγμα είναι οι pre- και post- increment and decrement. Οι χρήστες της PHP/FI 2 και πολλών άλλων γλωσσών ίσως να είναι εξοικειωμένοι με την γραφή variable++ και variable--. Πρόκειται για τους τελεστές αύξησης (increment) και μείωσης (decrement).

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

Το pre-increment, που γράφεται ως ++$variable είναι ίσο με την τιμή της μεταβλητής αυξημένης κατά ένα, δηλ. η PHP αυξάνει την τιμή της μεταβλητής πριν χρησιμοποιήσει την τιμή της.

Το post-increment, που γράφεται ως $variable++ είναι ίσο με την αρχική τιμή της $variable, πριν αυτή αυξηθεί, δηλ. η PHP αυξάνει την μεταβλητή αφού έχει χρησιμοποιήσει την τιμή της.

Ένας πολύ κοινός τύπος εκφράσεων είναι οι εκφράσεις σύγκρισης (comparison expressions), οι οποίες αποτιμούνται σε 0 ή 1, που σημαίνουν FALSE ή TRUE αντίστοιχα.

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

Το τελευταίο παράδειγμα εκφράσεων που θα δούμε είναι οι συνδυασμένες εκφράσεις τελεστή και εκχώρησης. Γνωρίζουμε ήδη ότι αν θέλουμε να αυξήσουμε το $a κατά 1, μπορούμε να γράψουμε απλά $a++ ή ++$a.

Αλλά, αν θέλουμε να προσθέσουμε περισσότερο από το 1, όπως για παράδειγμα το 3; Θα μπορούσαμε να γράψουμε το $a++ πολλές φορές, αλλά αυτό δεν είναι προφανώς κάτι αποδοτικό.

Η πρόσθεση του 3 στην τρέχουσα τιμή του $a μπορεί να γραφεί σαν $a += 3, που σημαίνει «πάρε την τιμή της $a, πρόσθεσε το 3 σ’ αυτήν και εκχώρησε το αποτέλεσμα πίσω ξανά στην $a». Υπάρχουν και οι τελεστές $a -= 5, δηλ. αφαίρεση του 5 από την τιμή της $a, $b *= 7, δηλ. πολλαπλασιασμός της τιμής της $b με το 7 κ.ά.

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

$first ? $second : $third

Αν η τιμή της πρώτης υποέκφρασης είναι true, δηλ. όχι μηδενική, τότε αποτιμάται η δεύτερη υποέκφραση και αυτό είναι και το αποτέλεσμα της έκφρασης υπό συνθήκη (conditional expression). Αλλιώς, αποτιμάται η τρίτη υποέκφραση και αυτή είναι η τιμή.

Το ακόλουθο παράδειγμα αναφέρεται στα παραπάνω :

function double($i) {

    return $i*2;

}

$b = $a = 5;  /* εκχωρείται η τιμή 5 στις μεταβλητές $a και $b */

$c = $a++;

/* post-increment, εκχωρείται η αρχική τιμή της $a (5) στην $c */

$e = $d = ++$b;

/* pre-increment, εκχωρείται η αυξημένη τιμή της $b (6) στις $d και $e

και σ’ αυτό το σημείο, οι $d και $e είναι ίσες με 6 */

$f = double($d++);

/* εκχωρείται η διπλή τιμή της $d πριν από την αύξησή της, δηλ. 2*6 = 12 στην $f */

$g = double(++$e);

/* εκχωρείται η διπλή τιμή της $e μετά από την αύξησή της, δηλ. 2*7 = 14 στην $g */

$h = $g += 10;

/* πρώτα, η $g αυξάνεται κατά 10 και τελειώνει με την τιμή 24, η τιμή

της εκχώρησης (24) εκχωρείται μετά στην $h και η $h τελειώνει με την τιμή 24 επίσης */

Η PHP δεν διαθέτει έναν λογικό τύπο δεδομένων (boolean) και η αληθής τιμή των εκφράσεων στην PHP υπολογίζεται με παρόμοιο τρόπο με την Perl. Αυτό σημαίνει ότι μια μη μηδενική αριθμητική τιμή είναι TRUE και το 0 είναι FALSE.

Οι αρνητικές τιμές δεν είναι ίσες με μηδέν και έτσι θεωρούνται TRUE. Το άδειο string και το string "0" είναι FALSE και όλα τα άλλα strings είναι TRUE. Με τις μη scalar τιμές (πίνακες και αντικείμενα), αν μια τιμή δεν περιέχει κάποιο στοιχείο θεωρείται FALSE, αλλιώς θεωρείται TRUE.

 

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

Οι αριθμητικοί τελεστές (arithmetic operators) της PHP είναι οι εξής :

Παράδειγμα

Όνομα

Αποτέλεσμα

$a + $b

Πρόσθεση

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

$a - $b

Αφαίρεση

Διαφορά των $a και $b

$a * $b

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

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

$a / $b

Διαίρεση

Πηλίκο των $a και $b

$a % $b

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

Ακέραιο υπόλοιπο του $a διαιρούμενο με το $b

 

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

Ο βασικός τελεστής εκχώρησης (assignment operator) είναι το =. Σημαίνει ότι ο αριστερός τελεστής γίνεται ίσος με την τιμή της έκφρασης που υπάρχει στα δεξιά.

Η τιμή μιας έκφρασης εκχώρησης είναι η τιμή που εκχωρείται, δηλ. η τιμή της έκφρασης $a = 3 είναι το 3. Αυτό μας δίνει τη δυνατότητα να κάνουμε μερικά έξυπνα κόλπα :

$a = ($b = 4) + 5;    // το $a γίνεται ίσο με 9 και το $b με 4

Εκτός από τον βασικό τελεστή εκχώρησης, υπάρχουν «συνδυασμένοι τελεστές» γι’ όλους τους δυαδικούς αριθμητικούς και αλφαριθμητικούς τελεστές οι οποίοι μας δίνουν τη δυνατότητα να χρησιμοποιήσουμε μια τιμή σε μια έκφραση και μετά να ορίσουμε την τιμή της με το αποτέλεσμα αυτής της έκφρασης. Για παράδειγμα :

$a = 3;

$a += 5;        // κάνει το $a ίσο με 8 σαν $a = $a + 5;

$b = "Hello ";

$b .= "There!";

// κάνει το $b ίσο με "Hello There!" σαν $b = $b . "There!";

Η παραπάνω εκχώρηση αντιγράφει την αρχική μεταβλητή στην καινούργια, που αποκαλείται εκχώρηση με τιμή (assignment by value) και έτσι οι αλλαγές που θα συμβούν στη μια απ’ αυτές δεν θα επηρεάσουν και την άλλη.

Η PHP4 υποστηρίζει την εκχώρηση με αναφορά (assignment by reference), χρησιμοποιώντας την σύνταξη $var = &$othervar;, κάτι που δεν ισχύει στην PHP3. Η εκχώρηση με αναφορά σημαίνει ότι και οι δύο μεταβλητές δείχνουν στα ίδια δεδομένα και τίποτα δεν αντιγράφεται.

 

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

Οι τελεστές δυαδικών πράξεων (bitwise operators) μάς δίνουν τη δυνατότητα να αλλάξουμε την τιμή συγκεκριμένων δυαδικών ψηφίων (bits) μέσα σ’ έναν ακέραιο.

Παράδειγμα

Όνομα

Αποτέλεσμα

$a & $b

And

Επιστρέφει 1 αν τα αντίστοιχα bits είναι 1 και στην $a και στην $b

$a | $b

Or

Επιστρέφει 1 αν ένα από τα αντίστοιχα bits είναι ίσα με 1 στην $a ή στην $b

$a Ù $b

Xor

Επιστρέφει 1 αν ένα από τα αντίστοιχα bits είναι ίσα με 1 στην $a ή στην $b αλλά όχι και στις δύο ταυτόχρονα

~$a

Not

Επιστρέφει 1 αν το αντίστοιχο bit του $a είναι 0, αλλιώς επιστρέφει 0

$a << $b

Shift left

Μετακινεί τα bits του $a κατά $b βήματα προς τα αριστερά, όπου το κάθε βήμα σημαίνει πολλαπλασιασμός επί 2

$a >> $b

Shift right

Μετακινεί τα bits του $a κατά $b βήματα προς τα δεξιά, όπου το κάθε βήμα σημαίνει διαίρεση με το 2

 

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

Οι τελεστές σύγκρισης (comparison operators) μάς δίνουν τη δυνατότητα να συγκρίνουμε δύο τιμές.

Παράδειγμα

Όνομα

Αποτέλεσμα

$a = = $b

Ίσο

True αν το $a είναι ίσο με το $b

$a = = = $b

Ακριβώς ίδιο

True αν τα $a είναι ίσο με $b και είναι του ίδιου τύπου (μόνο στην PHP4)

$a != $b

Όχι ίσο

True αν το $a δεν είναι ίσο με το $b

$a < $b

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

True αν το $a είναι μικρότερο από το $b

$a > $b

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

True αν το $a είναι μεγαλύτερο από το $b

$a <= $b

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

True αν το $a είναι μικρότερο ή ίσο από το $b

$a >= $b

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

True αν το $a είναι μεγαλύτερο ή ίσο από το $b

Ένας άλλος τελεστής υπό συνθήκη (conditional operator) είναι ο ?: ή τριαδικός (trinary) τελεστής, ο οποίος λειτουργεί όπως στην C και σ’ άλλες γλώσσες, ως εξής :

(expr1) ? (expr2) : (expr3);

Η παραπάνω έκφραση αποτιμάται στην expr2 αν η expr1 έχει αποτιμηθεί σε true και στην expr3 αν η expr1 έχει αποτιμηθεί σε false.

 

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

Η PHP υποστηρίζει έναν τελεστή εκτέλεσης (execution operator), τον backticks (``). Η PHP θα προσπαθήσει να εκτελέσει τα περιεχόμενα των backticks σαν μια εντολή shell. Η έξοδος μπορεί να ανατεθεί σε μια μεταβλητή.

$output = `ls -al`;

echo "<pre>$output</pre>";

Μπορούμε να δούμε επίσης και τις συναρτήσεις system(), passthru(), exec(), popen() και escapeshellcmd().

 

Οι Τελεστές Αύξησης/Μείωσης

Η PHP υποστηρίζει τους τελεστές αύξησης και μείωσης που θυμίζουν την C (C-style pre- and post-increment and decrement operators).

Παράδειγμα

Όνομα

Αποτέλεσμα

++$a

Pre-increment

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

$a++

Post-increment

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

--$a

Pre-decrement

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

$a--

Post-decrement

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

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

<?php

echo "<h3> Postincrement </h3>";

$a = 5;

echo "Πρέπει να είναι 5 : " . $a++ . "<br>\n";

echo "Πρέπει να είναι 6 : " . $a . "<br>\n";

 

echo "<h3> Preincrement </h3>";

$a = 5;

echo "Πρέπει να είναι 6 : " . ++$a . "<br>\n";

echo "Πρέπει να είναι 6 : " . $a . "<br>\n";

 

echo "<h3> Postdecrement </h3>";

$a = 5;

echo "Πρέπει να είναι 5 : " . $a-- . "<br>\n";

echo "Πρέπει να είναι 4 : " . $a . "<br>\n";

 

echo "<h3> Predecrement </h3>";

$a = 5;

echo "Πρέπει να είναι 4 : " . --$a . "<br>\n";

echo "Πρέπει να είναι 4 : " . $a . "<br>\n";

?>

 

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

Οι λογικοί τελεστές (logical operators) της PHP είναι οι εξής :

Παράδειγμα

Όνομα

Αποτέλεσμα

$a and $b

And

True αν και το $a και το $b είναι true

$a or $b

Or

True αν ένα από τα $a ή $b είναι true

$a xor $b

Xor

True αν ένα από τα $a ή $b είναι true αλλά όχι και τα δύο

!$a

Not

True αν το $a δεν είναι true

$a && $b

And

True αν και το $a και το $b είναι true

$a || $b

Or

True αν ένα από τα $a ή $b είναι true

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

 

Οι Τελεστές των Αλφαριθμητικών (Strings)

Υπάρχουν δύο τελεστές για τα αλφαριθμητικά (strings). Ο πρώτος είναι ο τελεστής συνένωσης (concatenation operator), '.', ο οποίος επιστρέφει την ένωση του δεξιού και του αριστερού του ορίσματος. Ο δεύτερος είναι ο τελεστής εκχώρησης συνένωσης (concatenating assignment operator), '.='.

$a = "Hello ";

$b = $a . "World!";  // το $b περιέχει το "Hello World!"

 

$a = "Hello ";

$a .= "World!";         // το $a περιέχει το "Hello World!"

 

Οι Δομές Ελέγχου (Control Structures)

Ένα script της PHP αποτελείται από μια σειρά εντολών, όπου μια εντολή μπορεί να είναι μια εκχώρηση, μια κλήση συνάρτησης, ένας βρόχος, μια εντολή υπό συνθήκη ή ακόμη και μια εντολή που δεν κάνει τίποτα (μια κενή, empty, εντολή). Οι εντολές τελειώνουν συνήθως με τον χαρακτήρα ; (semicolon).

Επιπλέον, οι εντολές μπορούν να ομαδοποιηθούν σε μια εντολή-ομάδα (statement-group) αν περικλείσουμε μια ομάδα εντολών με άγκιστρα { και }. Μια εντολή-ομάδα αποτελεί και η ίδια μια εντολή.

 

Η Εντολή If

Η σύνταξη της εντολής if στην PHP είναι παρόμοια μ’ αυτήν της C :

if (έκφραση)

… εντολή …

Αν η έκφραση αποτιμηθεί σε TRUE, η PHP θα εκτελέσει την εντολή, ενώ αν αποτιμηθεί σε FALSE, θα την αγνοήσει.

Το επόμενο παράδειγμα θα εμφανίσει ένα μήνυμα αν το $a είναι μεγαλύτερο από το $b :

if ($a > $b)

print "Το a είναι μεγαλύτερο από το b";

Μπορούμε να ομαδοποιήσουμε περισσότερες από μία εντολές, ως εξής :

if ($a > $b) {

print "Το a είναι μεγαλύτερο από το b";

$b = $a;

}

 

Η Εντολή Else

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

if ($a > $b) {

print "Το a είναι μεγαλύτερο από το b";

} else {

print "Το a ΔΕΝ είναι μεγαλύτερο από το b";

}

 

Η Εντολή Elseif

Η εντολή elseif είναι ένας συνδυασμός των εντολών if και else. Επεκτείνει μια εντολή if για να εκτελέσει μια διαφορετική εντολή στην περίπτωση που η έκφραση της εντολής if αποτιμηθεί σε FALSE, αλλά θα εκτελέσει αυτήν την εναλλακτική έκφραση μόνο αν η συνθήκη έκφρασης της elseif αποτιμηθεί σε TRUE.

Για παράδειγμα, ο επόμενος κώδικας ελέγχει τρεις περιπτώσεις και θα εμφανίσει ένα ανάλογο μήνυμα αν το a είναι μεγαλύτερο, ίσο ή μικρότερο από το b :

if ($a > $b) {

print "Το a είναι μεγαλύτερο από το b";

} elseif ($a == $b) {

print "Το a είναι ίσο με το b";

} else {

print "Το a είναι μικρότερο από το b";

}

 

Ένας Άλλος Τρόπος Σύνταξης των Δομών Ελέγχου

Η PHP προσφέρει μια εναλλακτική σύνταξη για μερικές από τις δομές ελέγχου της (control structures) και πιο συγκεκριμένα τις if, while, for και switch.

Η βασική μορφή της εναλλακτικής σύνταξης είναι να αλλάξει την αγκύλη ανοίγματος στον χαρακτήρα : και την αγκύλη κλεισίματος στο endif;, endwhile;, endfor; ή endswitch; αντίστοιχα.

<?php if ($a==5): ?>

Το a είναι ίσο με 5

<?php endif; ?>

Στο παραπάνω παράδειγμα, ένα μπλοκ της HTML βρίσκεται μέσα σε μια εντολή if που είναι γραμμένη με την εναλλακτική σύνταξη. Το μπλοκ της HTML θα εμφανισθεί μόνο αν το $a είναι ίσο με 5.

Η εναλλακτική σύνταξη ισχύει και για τις εντολές else και elseif επίσης.

Ακολουθεί μια δομή if με elseif και else στην εναλλακτική σύνταξη :

if ($a == 5):

print "Το a είναι ίσο με 5";

print "...";

elseif ($a == 6):

print "Το a είναι ίσο με 6";

print "!!!";

else:

print "Το a δεν είναι ούτε 5 ούτε 6";

endif;

 

Η Εντολή While

Οι βρόχοι while αποτελούν τον απλούστερο τύπο βρόχου στην PHP και συμπεριφέρονται όπως ακριβώς οι αντίστοιχοι βρόχοι στην C. Η βασική μορφή μιας εντολής while είναι η εξής :

while (έκφραση) … εντολή …

Η εντολή while λέει στην PHP να εκτελεί συνέχεια την ή τις εντολές για όσο διάστημα η έκφραση της while αποτιμάται σε TRUE. Η τιμή της έκφρασης ελέγχεται κάθε φορά στην αρχή του βρόχου.

Όπως και με την εντολή if, μπορούμε να ομαδοποιήσουμε πολλές εντολές μέσα στον ίδιο βρόχο while χρησιμοποιώντας τα { και } ή την εναλλακτική σύνταξη :

while (έκφραση): … εντολή ... endwhile;

Τα δύο επόμενα παραδείγματα είναι ολόιδια και εμφανίζουν και τα δύο τους αριθμούς 1 έως 10 :

$i = 1;

while ($i <= 10) {

print $i++;

}

 

$i = 1;

while ($i <= 10):

print $i;

$i++;

endwhile;

 

 Η Εντολή Do .. While

Οι βρόχοι do .. while είναι πολύ παρόμοιοι με τους βρόχους while, εκτός από το ότι η έκφραση ελέγχεται στο τέλος κάθε επανάληψης και όχι στην αρχή. Η βασική διαφορά τους από τους βρόχους while είναι ότι η πρώτη επανάληψη ενός βρόχου do .. while θα εκτελεσθεί σίγουρα τουλάχιστον μία φορά.

Υπάρχει μία μόνο σύνταξη για τον βρόχο do .. while :

$i = 0;

do {

print $i;

} while ($i>0);

Ο παραπάνω βρόχος θα εκτελεσθεί μία φορά ακριβώς, εφόσον μετά από την πρώτη επανάληψη, όταν ελέγχεται η έκφραση, αποτιμάται σε FA-LSE και έτσι τερματίζεται η εκτέλεση του βρόχου.

Μπορούμε να χρησιμοποιήσουμε την εντολή break για να σταματήσουμε την εκτέλεση ενός βρόχου στη μέση του κώδικα :

do {

if ($i < 5) {

print "Το i δεν είναι αρκετά μεγάλο";

break;

}

$i *= $factor;

if ($i < $minimum_limit) {

break;

}

print "Το i είναι ΟΚ";

... process I ...

} while(0);

 

Η Εντολή For

Οι βρόχοι for είναι οι πιο πολύπλοκοι βρόχοι στην PHP. Συμπεριφέρονται όπως οι αντίστοιχοί τους στην C και η σύνταξη ενός βρόχου for είναι η εξής :

for (έκφραση1; έκφραση2; έκφραση3) … εντολή …

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

Στην αρχή της κάθε επανάληψης αποτιμάται η έκφραση2 και αν αποτιμηθεί σε TRUE, ο βρόχος συνεχίζεται και εκτελούνται οι περιεχόμενες εντολές. Αν αποτιμηθεί σε FALSE, σταματάει η εκτέλεση του βρόχου. Στο τέλος της κάθε επανάληψης αποτιμάται (εκτελείται) η έκφραση3.

Και οι τρεις εκφράσεις μπορούν να είναι κενές (empty). Αν είναι κενή η έκφραση2, αυτό σημαίνει ότι ο βρόχος θα εκτελείται ασταμάτητα. Αυτό είναι χρήσιμο όταν θέλουμε να βγούμε από τον βρόχο χρησιμοποιώντας μια εντολή break.

Και τα τέσσερα επόμενα παραδείγματα εμφανίζουν τους αριθμούς από 1 έως 10 :

/* παράδειγμα 1 */

for ($i = 1; $i <= 10; $i++) {

print $i;

}

 

/* παράδειγμα 2 */

for ($i = 1;;$i++) {

if ($i > 10) {

break;

}

print $i;

}

 

/* παράδειγμα 3 */

$i = 1;

for (;;) {

if ($i > 10) {

break;

}

print $i;

$i++;

}

 

/* παράδειγμα 4 */

for ($i = 1; $i <= 10; print $i, $i++) ;

Η PHP υποστηρίζει επίσης και την εναλλακτική σύνταξη για τους βρόχους for :

for (έκφραση1; έκφραση2; έκφραση3): εντολή; ...; endfor;

Ενώ άλλες γλώσσες χρησιμοποιούν την εντολή foreach για να διασχίσουν έναν πίνακα (array) ή ένα hash, η PHP χρησιμοποιεί την εντολή while και τις συναρτήσεις list() και each() γι’ αυτόν τον σκοπό.

 

Η Εντολή Break

Με την εντολή break μπορούμε να εξέλθουμε από μια δομή ελέγχου χωρίς να περιμένουμε να ικανοποιηθεί η συνθήκη εξόδου του βρόχου.

$i = 0;

while ($i < 10) {

if ($arr[$i] == "stop") {

break;

}

$i++;

}

 

Η Εντολή Continue

Η εντολή continue χρησιμοποιείται σε δομές βρόχου για να συνεχίσει την εκτέλεση του προγράμματος από την αρχή του βρόχου και να αγνοήσει έτσι τις υπόλοιπες εντολές μέχρι το τέλος του βρόχου.

while (list($key, $value) = each($arr)) {

if ($key % 2) {           // αγνοεί τους άρτιους αριθμούς

continue;

}

do_something_odd ($value);

}

 

Η Εντολή Switch

Η εντολή switch είναι παρόμοια με μια σειρά εντολών if στην ίδια έκφραση. Υπάρχουν πολλές περιπτώσεις όπου θέλουμε να συγκρίνουμε την ίδια μεταβλητή ή έκφραση με πολλές διαφορετικές τιμές και να εκτελέσουμε ένα διαφορετικό κομμάτι κώδικα ανάλογα με την τιμή της μεταβλητής.

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

if ($i == 0) {

print "Το i είναι ίσο με 0";

}

if ($i == 1) {

print "Το i είναι ίσο με 1";

}

if ($i == 2) {

print "Το i είναι ίσο με 2";

}

 

switch ($i) {

case 0:

print "Το i είναι ίσο με 0";

break;

case 1:

print "Το i είναι ίσο με 1";

break;

case 2:

print "Το i είναι ίσο με 2";

break;

}

Μόλις η εντολή switch βρει μια εντολή case με μια τιμή που να ταιριάζει με την τιμή της έκφρασης της switch, η PHP αρχίζει να εκτελεί τις εντολές. Η PHP συνεχίζει να εκτελεί τις εντολές μέχρι το τέλος του μπλοκ της switch ή μόλις συναντήσει μια εντολή break.

Αν δεν συμπεριλάβουμε μια εντολή break στο τέλος μιας εντολής case, η PHP θα συνεχίσει να εκτελεί τις εντολές και από τις επόμενες εντολές case, όπως για παράδειγμα :

switch ($i) {

case 0:

print "Το i είναι ίσο με 0";

case 1:

print "Το i είναι ίσο με 1";

case 2:

print "Το i είναι ίσο με 2";

}

Εδώ, αν το $i είναι ίσο με 0, η PHP θα εκτελέσει όλες τις εντολές print, αν το $i είναι ίσο με 1, η PHP θα εκτελέσει τις δύο τελευταίες εντολές print και μόνο αν το $i είναι ίσο 2, θα έχουμε την αναμενόμενη συμπεριφορά και θα εκτελεσθεί μόνο η τελευταία εντολή print.

Μια εντολή case μπορεί να είναι κενή και έτσι ο έλεγχος να μεταβιβασθεί στην επόμενη εντολή case.

switch ($i) {

case 0:

case 1:

case 2:

print "Το i είναι μικρότερο από 3 αλλά όχι αρνητικό";

break;

case 3:

print "Το i είναι ίσο με 3";

}

Μια ειδική περίπτωση case αποτελεί το default case, το οποίο ταιριάζει μ’ ο,τιδήποτε δεν ταίριαξε από τις άλλες cases. Για παράδειγμα :

switch ($i) {

case 0:

print "Το i είναι ίσο με 0";

break;

case 1:

print "Το i είναι ίσο με 1";

break;

case 2:

print "Το i είναι ίσο με 2";

break;

default:

print "Το i δεν είναι ίσο με 0, 1 ή 2";

}

Η εναλλακτική σύνταξη των δομών ελέγχου υποστηρίζεται και στην εντολή switch.

switch ($i):

case 0:

print "Το i είναι ίσο με 0";

break;

case 1:

print "Το i είναι ίσο με 1";

break;

case 2:

print "Το i είναι ίσο με 2";

break;

default:

print "Το i δεν είναι ίσο με 0, 1 ή 2";

endswitch;

 

Η Συνάρτηση require()

Η εντολή require() αντικαθιστά τον εαυτό της μ’ ένα συγκεκριμένο αρχείο, όπως ακριβώς δουλεύει δηλαδή η εντολή #include στην C.

Κάτι σημαντικό που πρέπει να έχουμε υπόψη μας είναι ότι όταν ένα αρχείο χρησιμοποιείται σε μια από τις συναρτήσεις include() ή require(), η ανάλυση (parsing) ξεφεύγει από τον έλεγχο της PHP, πηγαίνει στον έλεγχο της HTML στην αρχή του αρχείου και επανέρχεται στον έλεγχο της PHP ξανά στο τέλος.

Γι’ αυτόν τον λόγο, ο κώδικας που υπάρχει μέσα στο αρχείο και ο οποίος πρέπει να εκτελεσθεί σαν κώδικας της PHP πρέπει να περικλείεται με έγκυρα tags αρχής και τέλους της PHP.

Η require() δεν είναι ουσιαστικά μια συνάρτηση της PHP και αποτελεί περισσότερο μια δομή της γλώσσας. Υπόκειται σε μερικούς διαφορετικούς ρόλους απ’ ό,τι οι συναρτήσεις. Για παράδειγμα, η require() δεν υπόκειται σε δομές ελέγχου (control structures) και ακόμη, δεν επιστρέφει κάποια τιμή.

Σ’ αντίθεση με την include(), η require() θα διαβασθεί πάντα στο αρχείο (target file), ακόμη κι αν η γραμμή στην οποία βρίσκεται δεν εκτελείται ποτέ. Αν θέλουμε να συμπεριλάβουμε ένα αρχείο υπό συνθήκη, πρέπει να χρησιμοποιήσουμε τη συνάρτηση include().

Η εντολή υπό συνθήκη δεν θα επηρεάσει την require(). Όμως, αν η γραμμή στην οποία βρίσκεται η require() δεν εκτελεσθεί, δεν θα εκτελεσθεί ούτε ο κώδικας που υπάρχει στο αρχείο (target file).

Παρόμοια, οι δομές βρόχου δεν επηρεάζουν τη συμπεριφορά της require(). Αν και ο κώδικας που περιέχεται στο αρχείο (target file) υπόκειται ακόμα στον βρόχο, η ίδια η require() εκτελείται μία μόνο φορά.

Αυτό σημαίνει ότι δεν μπορούμε να τοποθετήσουμε μια εντολή require() μέσα σε μια δομή βρόχου και να αναμένουμε να συμπεριλάβει τα περιεχόμενα ενός διαφορετικού αρχείου σε κάθε επανάληψη. Για να το κάνουμε αυτό, χρησιμοποιούμε μια εντολή include().

require( 'header.inc' );

Πρέπει να έχουμε υπόψη μας ότι και η include() και η require() στην ουσία τραβούν τα περιεχόμενα του αρχείου (target file) στο ίδιο το καλών αρχείο script (calling script file) και δεν καλούν το target μέσω HTTP ή με κάτι παρόμοιο.

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

require( "file.inc?varone=1&vartwo=2" ); /* Δεν θα δουλέψει */

$varone = 1;

$vartwo = 2;

require( "file.inc" );

/* Οι $varone και $vartwo θα είναι διαθέσιμες στο file.inc */

             

Η Συνάρτηση include()

Η εντολή include() περιλαμβάνει και αποτιμά το καθορισμένο αρχείο. Κάτι σημαντικό που πρέπει να γνωρίζουμε για το πώς λειτουργεί αυτό, είναι ότι όταν ένα αρχείο γίνεται include() ή require(), η ανάλυση ξεφεύγει από τον έλεγχο της PHP και πηγαίνει στον έλεγχο της HTML στην αρχή του αρχείου (target file) και επανέρχεται ξανά στο τέλος.

Γι’ αυτόν τον λόγο, ο κώδικας που υπάρχει μέσα στο αρχείο target και ο οποίος πρέπει να εκτελεσθεί σαν κώδικας της PHP πρέπει να περικλείεται με έγκυρα tags αρχής και τέλους της PHP.

Αυτό συμβαίνει κάθε φορά που συναντάται η εντολή include(), έτσι μπορούμε να χρησιμοποιήσουμε μια εντολή include() μέσα σε μια δομή βρόχου για να συμπεριλάβουμε έναν αριθμό από διαφορετικά αρχεία.

$files = array ('first.inc', 'second.inc', 'third.inc');

for ($i = 0; $i < count($files); $i++) {

include $files[$i];

}

Η include() διαφέρει από την require() στο ότι η εντολή include αποτιμάται κάθε φορά που συναντάται (και μόνο όταν εκτελείται), ενώ η εντολή require() αντικαθίσταται από το αρχείο required όταν συναντάται για πρώτη φορά, αν τα περιεχόμενα του αρχείου θα αποτιμηθούν ή όχι. Για παράδειγμα, αν βρίσκεται μέσα σε μια εντολή if η συνθήκη της οποίας έχει αποτιμηθεί σε false.

Επειδή η include() αποτελεί μια ειδική δομή γλώσσας, πρέπει να την περικλείσουμε σ’ ένα μπλοκ εντολών αν βρίσκεται μέσα σ’ ένα μπλοκ υπό συνθήκη (conditional block).

/* Αυτό είναι ΛΑΘΟΣ και δεν θα δουλέψει όπως αναμένεται */

if ($condition)

include($file);

else

include($other);

 /* Αυτό είναι ΣΩΣΤΟ */

if ($condition) {

include($file);

} else {

include($other);

}

Και στην PHP3 και στην PHP4, είναι δυνατό να εκτελέσουμε μια εντολή return μέσα σ’ ένα αρχείο που έχει γίνει include(), ώστε να τερματίσουμε την επεξεργασία σ’ αυτό το αρχείο και να επιστρέψουμε στο script που το κάλεσε. Υπάρχουν, όμως, μερικές διαφορές στον τρόπο που δουλεύει αυτό.

Η πρώτη είναι ότι στην PHP3, το return δεν μπορεί να εμφανισθεί μέσα σ’ ένα μπλοκ εκτός κι αν είναι ένα function block, όπου το return εφαρμόζεται σ’ εκείνη τη συνάρτηση και όχι σ’ ολόκληρο το αρχείο. Στην PHP4, όμως, δεν υπάρχει αυτός ο περιορισμός.

Επίσης, η PHP4 μάς δίνει τη δυνατότητα να επιστρέψουμε τιμές από τα αρχεία που έχουν γίνει include(). Μπορούμε να αντιμετωπίσουμε την τιμή μιας κλήσης στην include() όπως και με μια κανονική συνάρτηση. Αυτό δημιουργεί ένα parse error στην PHP3.

Ακολουθεί ένα παράδειγμα με την include() στην PHP3 και την PHP4. Υποθέτουμε ότι το αρχείο test.inc βρίσκεται στον ίδιο κατάλογο με το κύριο αρχείο :

<?php

echo "Before the return <br>\n";

if ( 1 ) {

return 27;

}

echo "After the return <br>\n";

?>

Υποθέτουμε ότι το κύριο αρχείο (main.html) περιέχει τα εξής :

<?php

$retval = include( 'test.inc' );

echo "File returned : '$retval'<br>\n";

?>

Όταν κληθεί η main.html στην PHP3, θα δημιουργηθεί ένα λάθος ανάλυσης (parse error) στη γραμμή 2 και αυτό γιατί δεν μπορούμε να πάρουμε την τιμή μιας συνάρτησης include() στην PHP3. Στην PHP4, όμως, το αποτέλεσμα θα είναι :

Before the return

File returned : '27'

Τώρα, ας υποθέσουμε ότι το main.html έχει τροποποιηθεί ώστε να περιέχει τα εξής :

<?php

include( 'test.inc' );

echo "Back in main.html<br>\n";

?>

Στην PHP4, η έξοδος θα είναι :

Before the return

Back in main.html

Όμως, η PHP3 θα δώσει την εξής έξοδο :

Before the return

27Back in main.html

Parse error: parse error in

/home/torben/public_html/phptest/main.html on line 5

Το παραπάνω parse error είναι ένα αποτέλεσμα του γεγονότος ότι η εντολή return περικλείεται σ’ ένα non-function block μέσα στο αρχείο test.inc. Αν μετακινηθεί η εντολή return έξω από το μπλοκ, η έξοδος θα είναι η εξής :

Before the return

27Back in main.html

 

Συναρτήσεις Οριζόμενες από τον Χρήστη

Μπορούμε να ορίσουμε μια συνάρτηση (function) χρησιμοποιώντας μια σύνταξη σαν την εξής :

function foo ($arg_1, $arg_2, ..., $arg_n) {

echo "Example function.\n";

return $retval;

}

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

Η PHP δεν υποστηρίζει την υπέρβαση των συναρτήσεων (function overloading), ούτε είναι δυνατό να καταργήσουμε τον ορισμό (undefine) ή να ορίσουμε ξανά (redefine) ήδη δηλωμένες συναρτήσεις.

Η PHP3 δεν υποστηρίζει μεταβλητό αριθμό ορισμάτων στις συναρτήσεις αν και υποστηρίζει τα προκαθορισμένα ορίσματα (default arguments). Η PHP4 υποστηρίζει και τα δύο.

 

Τα Ορίσματα των Συναρτήσεων

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

Η PHP υποστηρίζει τη μεταβίβαση (πέρασμα) των ορισμάτων (arguments) με τιμή (by value), που είναι το προεπιλεγμένο, τη μεταβίβαση με αναφορά (by reference) καθώς και τις προκαθορισμένες τιμές ορισμάτων (default argument values).

Οι λίστες ορισμάτων μεταβλητού μήκους (variable-length argument lists) υποστηρίζονται μόνο στην PHP4. Μπορούμε να πετύχουμε ένα παρόμοιο αποτέλεσμα στην PHP3 μεταβιβάζοντας έναν πίνακα ορισμάτων σε μια συνάρτηση :

function takes_array($input) {

echo "$input[0] + $input[1] = ", $input[0]+$input[1];

}

 

Μεταβίβαση Ορισμάτων με Αναφορά

Εξ ορισμού, τα ορίσματα των συναρτήσεων μεταβιβάζονται με τιμή (by value), που σημαίνει ότι αν αλλάξουμε την τιμή του ορίσματος μέσα στη συνάρτηση, δεν αλλάζει και εκτός της συνάρτησης. Αν θέλουμε να μπορεί μια συνάρτηση να τροποποιεί τα ορίσματά της, πρέπει να τα μεταβιβάσουμε με αναφορά (by reference).

Αν θέλουμε ένα όρισμα σε μια συνάρτηση να μεταβιβάζεται πάντα με αναφορά, πρέπει να προσθέσουμε το σύμβολο & (ampersand) πριν από το όνομα του ορίσματος στον ορισμό της συνάρτησης :

function add_some_extra(&$string) {

$string .= 'and something extra.';

}

$str = 'This is a string, ';

add_some_extra($str);

echo $str;      // εμφανίζει 'This is a string, and something extra.'

Αν θέλουμε να περάσουμε μια μεταβλητή με αναφορά σε μια συνάρτηση που δεν το κάνει αυτό εξ ορισμού, θα πρέπει να προσθέσουμε τον χαρακτήρα & (ampersand) στο όνομα του ορίσματος κατά την κλήση της συνάρτησης :

function foo ($bar) {

$bar .= ' and something extra.';

}

$str = 'This is a string, ';

foo ($str);

echo $str;      // εμφανίζει 'This is a string, '

foo (&$str);

echo $str;      // εμφανίζει 'This is a string, and something extra.'

 

Προκαθορισμένες Τιμές Ορισμάτων

Μια συνάρτηση μπορεί να ορίσει προκαθορισμένες τιμές του στυλ της C++ για ορίσματα scalar, ως εξής :

function makecoffee ($type = "cappuccino") {

return "Making a cup of $type.\n";

}

echo makecoffee ();

echo makecoffee ("espresso");

Η έξοδος από τον παραπάνω κώδικα είναι η εξής :

Making a cup of cappuccino.

Making a cup of espresso.

Η προκαθορισμένη τιμή πρέπει να είναι μια σταθερή έκφραση και όχι, για παράδειγμα, μια μεταβλητή ή ένα μέλος μιας τάξης (class member).

Πρέπει να έχουμε υπόψη μας ότι όταν χρησιμοποιούμε προκαθορισμένα ορίσματα σε συναρτήσεις, αυτά θα πρέπει να βρίσκονται στα δεξιά των μη προκαθορισμένων ορισμάτων, αλλιώς δεν θα έχουμε τα αναμενόμενα αποτελέσματα. Ακολουθεί ένα παράδειγμα :

function makeyogurt ($type = "acidophilus", $flavour) {

return "Making a bowl of $type $flavour.\n";

}

echo makeyogurt ("raspberry");    // δεν δουλεύει όπως περιμέναμε

Η έξοδος του παραπάνω παραδείγματος είναι η εξής :

Warning: Missing argument 2 in call to makeyogurt() in

/usr/local/etc/httpd/htdocs/php3test/functest.html on line 41

Making a bowl of raspberry.

Τώρα, συγκρίνετε το παραπάνω με το εξής :

function makeyogurt ($flavour, $type = "acidophilus") {

return "Making a bowl of $type $flavour.\n";

}

echo makeyogurt ("raspberry");    // δουλεύει όπως περιμέναμε

Η έξοδος αυτού του παραδείγματος είναι η εξής :

Making a bowl of acidophilus raspberry.

 

Επιστρεφόμενες Τιμές Συναρτήσεων

Οι τιμές των συναρτήσεων επιστρέφονται με την προαιρετική εντολή return. Όλοι οι τύποι δεδομένων μπορούν να επιστραφούν, ανάμεσά τους οι λίστες (lists) και τα αντικείμενα (objects).

function square ($num) {

return $num * $num;

}

echo square (4);   // εμφανίζει '16'

Δεν μπορούμε να επιστρέψουμε πολλαπλές τιμές από μια συνάρτηση, αλλά μπορούμε να πετύχουμε ένα παρόμοιο αποτέλεσμα αν επιστρέψουμε μια λίστα (list).

function small_numbers() {

return array (0, 1, 2);

}

list ($zero, $one, $two) = small_numbers();

 

Οι Μεταβλητές Συναρτήσεις

Η PHP υποστηρίζει την έννοια των μεταβλητών συναρτήσεων (variable functions). Αυτό σημαίνει ότι αν ένα όνομα μεταβλητής έχει παρενθέσεις, η PHP θα αναζητήσει μια συνάρτηση που έχει το ίδιο όνομα με την τιμή της μεταβλητής και θα προσπαθήσει να την εκτελέσει.

<?php

function foo() {

echo "In foo()<br>\n";

}

 

function bar( $arg = '' ) {

echo "In bar(); argument was '$arg'.<br>\n";

}

$func = 'foo';

$func();

$func = 'bar';

$func( 'test' );

?>

 

Τάξεις και Αντικείμενα

Μια τάξη (class) είναι μια συλλογή από μεταβλητές και από συναρτήσεις που εφαρμόζονται σ’ αυτές τις μεταβλητές. Για να ορίσουμε μια τάξη χρησιμοποιούμε την εξής σύνταξη :

<?php

class Cart {

var $items;    // Τα items στο shopping cart

// Προσθέτουμε $num προϊόντα του $artnr στο cart

function add_item ($artnr, $num) {

$this->items[$artnr] += $num;

}

// Αφαιρούμε $num προϊόντα του $artnr από το cart

function remove_item ($artnr, $num) {

if ($this->items[$artnr] > $num) {

$this->items[$artnr] -= $num;

return true;

} else {

return false;

}

}

}

?>

Αυτό ορίζει μια τάξη με όνομα Cart η οποία αποτελείται από έναν πίνακα προϊόντων στο cart (καλάθι αγορών) και δύο συναρτήσεις για να μπορούμε να προσθέσουμε και να αφαιρέσουμε προϊόντα από το cart.

Οι τάξεις είναι τύποι και μπορούμε να δημιουργήσουμε μια μεταβλητή ενός συγκεκριμένου τύπου με τον τελεστή new, ως εξής :

$cart = new Cart;

$cart->add_item("10", 1);

Ο παραπάνω κώδικας δημιουργεί ένα αντικείμενο με όνομα $cart από την τάξη Cart. Η συνάρτηση add_item() αυτού του αντικειμένου καλείται για να προσθέσει ένα προϊόν με κωδικό αριθμό 10 στο cart.

Οι τάξεις μπορεί να είναι επεκτάσεις (extensions) άλλων τάξεων. Η προκύπτουσα τάξη έχει όλες τις μεταβλητές και τις συναρτήσεις της βασικής τάξης και ό,τι προσθέσουμε εμείς. Αυτό μπορούμε να το κάνουμε με τη λέξη κλειδί extends. Δεν υποστηρίζεται η πολλαπλή κληρονομικότητα (multiple inheritance).

class Named_Cart extends Cart {

var $owner;

 

function set_owner ($name) {

$this->owner = $name;

}

}

Ο παραπάνω κώδικας ορίζει μια τάξη με όνομα Named_Cart που έχει όλες τις μεταβλητές και τις συναρτήσεις της τάξης Cart συν μια επιπλέον μεταβλητή με όνομα $owner και μια επιπλέον συνάρτηση με όνομα set_owner(). Μπορούμε τώρα να ορίσουμε και να μάθουμε τον ιδιοκτήτη (owner) ενός cart.

$ncart = new Named_Cart;                        // Δημιουργία ενός named cart

$ncart->set_owner ("kris");                       // Όνομα του ιδιοκτήτη του cart

print $ncart->owner;

// εκτύπωση του ονόματος του ιδιοκτήτη του cart

$ncart->add_item ("10", 1);

// μια συνάρτηση που την έχει κληρονομήσει από το cart

Μέσα στις συναρτήσεις μιας τάξης, η μεταβλητή $this σημαίνει το ίδιο το αντικείμενο. Μπορούμε να χρησιμοποιήσουμε τη σύνταξη $this->something για να έχουμε πρόσβαση σε μια οποιαδήποτε μεταβλητή ή συνάρτηση με όνομα something του τρέχοντος αντικειμένου.

Οι δημιουργοί (constructors) είναι συναρτήσεις σε μια τάξη που καλούνται αυτόματα όταν δημιουργούμε ένα νέο στιγμιότυπο (instance) μιας τάξης. Μια συνάρτηση γίνεται δημιουργός (constructor) όταν έχει το ίδιο όνομα με την τάξη.

class Auto_Cart extends Cart {

function Auto_Cart () {

$this->add_item ("10", 1);

}

}

Ο παραπάνω κώδικας δημιουργεί μια τάξη με όνομα Auto_Cart που είναι μια επέκταση της τάξης Cart συν έναν δημιουργό (constructor) ο οποίος αρχικοποιεί το cart μ’ ένα στοιχείο του προϊόντος που έχει κωδικό αριθμό 10 κάθε φορά που δημιουργείται ένα νέο Auto_Cart με τον τελεστή new. Οι δημιουργοί μπορούν επίσης να λάβουν ορίσματα και αυτά τα ορίσματα μπορεί να είναι προαιρετικά.

class Constructor_Cart extends Cart {

function Constructor_Cart ($item = "10", $num = 1) {

$this->add_item ($item, $num);

}

}

// Shop the same old boring stuff.

$default_cart   = new Constructor_Cart;

// Shop for real ...

$different_cart = new Constructor_Cart ("20", 17);

 

Δημιουργία Εικόνων Gif

Η PHP δεν περιορίζεται στο να δημιουργεί μόνο μια έξοδο κώδικα της HTML. Μπορεί επίσης να χρησιμοποιηθεί για να δημιουργήσει αρχεία εικόνων GIF ή και ροές (streams) εικόνων GIF. Θα χρειασθεί να μεταγλωττίσουμε την PHP με τη βιβλιοθήκη GD των συναρτήσεων εικόνας για να μπορέσει να δουλέψει αυτό.

<?php

Header("Content-type: image/gif");

$string=implode($argv," ");

$im = imagecreatefromgif("images/button1.gif");

$orange = ImageColorAllocate($im, 220, 210, 60);

$px = (imagesx($im)-7.5*strlen($string))/2;

ImageString($im, 3, $px, 9, $string, $orange);

ImageGif($im);

ImageDestroy($im);

?>

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

<img src="button.php3?text">

Το παραπάνω script button.php3 λαμβάνει μετά αυτό το string "text" και το τοποθετεί στην κορυφή μιας εικόνας βάσης που είναι η "images/ button1.gif" και εξάγει την εικόνα που δημιουργείται.

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

 

Επικύρωση (Authentication) του HTTP με την PHP

Η επικύρωση (authentication) του HTTP στην PHP είναι διαθέσιμη μόνο όταν εκτελείται σαν ένα Apache module και δεν είναι συνεπώς διαθέσιμη στο CGI. Σ’ ένα script της PHP σ’ ένα Apache module, μπορούμε να χρησιμοποιήσουμε τη συνάρτηση Header() για να στείλουμε ένα μήνυμα "Authentication Required" στον φυλλομετρητή του χρήστη (πελάτη) για να εμφανίσει (pop up) ένα παράθυρο εισόδου Username/Password.

Αφού ο χρήστης έχει καταχωρήσει ένα username και ένα password, θα κληθεί ξανά το URL που περιέχει το PHP script με τις μεταβλητές $PHP_AUTH_USER, $PHP_AUTH_PW και $PHP_AUTH_TYPE που περιέχουν αντίστοιχα το user name, το password και τον τύπο επικύρωσης (authentication type).

Ένα παράδειγμα script το οποίο θα επέβαλε την επικύρωση του πελάτη (client authentication) σε μια σελίδα, είναι το εξής :

<?php

if(!isset($PHP_AUTH_USER)) {

Header("WWW-Authenticate : Basic realm=\"My Realm\"");

Header("HTTP/1.0 401 Unauthorized");

echo "Κείμενο που θα σταλεί αν πατηθεί το Cancel\n";

exit;

} else {

echo "Hello $PHP_AUTH_USER <P>";

echo "Καταχωρήσατε το $PHP_AUTH_PW για password <P>";

}

?>

Αντί να εκτυπώσουμε απλά τα $PHP_AUTH_USER και $PHP_AUTH_ PW, θα θέλαμε πιθανώς να ελέγξουμε αν είναι έγκυρα τα username και password. Αυτό μπορεί να γίνει στέλνοντας ένα ερώτημα (query) σε μια βάση δεδομένων ή αναζητώντας τον χρήστη σ’ ένα αρχείο dbm.

Για να μπορέσουμε να εμποδίσουμε κάποιον από το να γράψει ένα script που να αποκαλύπτει το password μιας σελίδας που έχει επικυρωθεί (authenticated) μέσω ενός παραδοσιακού εξωτερικού μηχανισμού, οι μεταβλητές PHP_AUTH δεν θα ορισθούν αν είναι ενεργοποιημένη η εξωτερική επικύρωση (external authentication) γι’ αυτή τη συγκεκριμένη σελίδα.

Σ’ αυτήν την περίπτωση, η μεταβλητή $REMOTE_USER μπορεί να χρησιμοποιηθεί για να αναγνωρισθεί ο εξωτερικά επικυρωμένος χρήστης.

Παρ’ όλα αυτά, όμως, τα παραπάνω δεν αποτρέπουν κάποιον που ελέγχει ένα μη επικυρωμένο (non-authenticated) URL από το να κλέβει passwords από επικυρωμένα URLs στον ίδιο server.

Ακολουθεί ένα παράδειγμα επικύρωσης (authentication) HTTP που επιβάλει ένα νέο name/password.

<?php

function  authenticate()  {

Header( "WWW-authenticate:  basic  realm='Test  Authentication

System'");

Header( "HTTP/1.0  401  Unauthorized");

echo  "Πρέπει να καταχωρήσετε ένα έγκυρο login  ID και

password για να έχετε πρόσβαση σ’ αυτά τα στοιχεία\n";

exit;

}

if(!isset($PHP_AUTH_USER)  ||  ($SeenBefore ==  1  &&

!strcmp($OldAuth,  $PHP_AUTH_USER))  )  {

authenticate();

}

else  {

echo  "Welcome:  $PHP_AUTH_USER<BR>";

echo  "Old:  $OldAuth";

echo  "<FORM  ACTION=\"$PHP_SELF\"

METHOD=POST>\n";

echo  "<INPUT  TYPE=HIDDEN  NAME=\"SeenBefore\"

VALUE=\"1\">\n";

echo  "<INPUT  TYPE=HIDDEN  NAME=\"OldAuth\"

VALUE=\"$PHP_AUTH_USER\">\n";

echo  "<INPUT  TYPE=Submit

VALUE=\"Re  Authenticate\">\n";

echo  "</FORM>\n";

}

?>

 

Τα Cookies

Η PHP υποστηρίζει καθαρά τα HTTP cookies, τα οποία είναι ένας μηχανισμός αποθήκευσης δεδομένων στον απομακρυσμένο φυλλομετρητή για να μπορούμε έτσι να παρακολουθούμε ή να αναγνωρίζουμε τους χρήστες. Μπορούμε να ορίσουμε cookies με τη συνάρτηση setcookie().

Τα cookies αποτελούν μέρος της επικεφαλίδας (header) του HTTP και έτσι η συνάρτηση setcookie() πρέπει να κληθεί πριν σταλεί κάποια έξοδος στον φυλλομετρητή. Αυτός είναι ο ίδιος περιορισμός που έχει και η συνάρτηση header().

Τα cookies που στέλνονται σε μας από τον πελάτη (client) μετατρέπονται αυτόματα σε μια μεταβλητή της PHP όπως ακριβώς συμβαίνει με τις μεθόδους GET και POST. Αν θελήσουμε να εκχωρήσουμε πολλαπλές τιμές σ’ ένα μόνο cookie, προσθέτουμε τα [ ] στο όνομα του cookie.

 

Uploads με τη Μέθοδο POST

Η PHP μπορεί να λάβει uploads αρχείων από έναν συμβατό φυλλομετρητή με το RFC-1867, όπως είναι ο Netscape Navigator και ο Microsoft Internet Explorer. Με τη δυνατότητα αυτή μπορεί κάποιος να κάνει upload και κείμενο (text) και δυαδικά αρχεία (binary files).

Με τις συναρτήσεις για επικύρωση της PHP και χειρισμό αρχείων, έχουμε πλήρη έλεγχο για το ποιος έχει το δικαίωμα να κάνει upload και το τι πρέπει να γίνει με το αρχείο αφού έχει γίνει upload.

Μπορούμε να δημιουργήσουμε μια φόρμα ειδικά για upload αρχείων, ως εξής :

<FORM ENCTYPE="multipart/form-data" ACTION="_URL_"

METHOD=POST>

<INPUT TYPE="hidden" name="MAX_FILE_SIZE"

value="1000">

Send this file : <INPUT NAME="userfile" TYPE="file">

<INPUT TYPE="submit" VALUE="Send File">

</FORM>

Το _URL_ πρέπει να δείχνει σ’ ένα αρχείο της PHP, ενώ το κρυμμένο πεδίο MAX_FILE_SIZE πρέπει να προηγείται από το πεδίο file input και η τιμή του είναι το μέγιστο αποδεκτό μέγεθος αρχείου (maximum filesize) σε bytes.

Σ’ αυτό το αρχείο προορισμού, ορίζονται οι ακόλουθες μεταβλητές για ένα επιτυχημένο upload :

Πρέπει να έχουμε υπόψη μας ότι το τμήμα $userfile των παραπάνω μεταβλητών είναι το ίδιο με το όνομα του πεδίου INPUT που έχει τύπο TYPE=file στη φόρμα upload, όπως userfile στο παραπάνω παράδειγμα.

Τα αρχεία εξ ορισμού αποθηκεύονται στον προκαθορισμένο προσωρινό κατάλογο του server (temporary directory). Αυτό μπορεί να αλλάξει ορίζοντας τη μεταβλητή περιβάλλοντος TMPDIR στο περιβάλλον στο οποίο εκτελείται η PHP. Αν την ορίσουμε χρησιμοποιώντας τη συνάρτηση putenv() μέσα από ένα script της PHP δεν θα δουλέψει.

Το script της PHP το οποίο λαμβάνει το αρχείο που γίνεται upload θα εφαρμόσει όποια λογική είναι απαραίτητη για να καθορίσει το τι πρέπει να γίνει με το αρχείο που γίνεται upload. Μπορούμε, για παράδειγμα, να χρησιμοποιήσουμε τη μεταβλητή $file_size για να απορρίψουμε όλα τα αρχεία που είναι είτε πάρα πολύ μικρά ή πάρα πολύ μεγάλα.

Μπορούμε να χρησιμοποιήσουμε τη μεταβλητή $file_type για να απορρίψουμε όλα τα αρχεία που δεν ταιριάζουν με κάποια συγκεκριμένα κριτήρια. Θα πρέπει είτε να διαγράψουμε το αρχείο από τον προσωρινό κατάλογο ή να το μετακινήσουμε κάπου αλλού ή να το μετονομάσουμε.

 

Uploading Πολλών Αρχείων

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

<form action="file-upload.html" method="post"

enctype="multipart/form-data">

Send these files : <br>

<input name="userfile[]" type="file"><br>

<input name="userfile[]" type="file"><br>

<input type="submit" value="Send files">

</form>

Όταν υποβάλλεται η παραπάνω φόρμα, θα σχηματισθούν οι πίνακες $userfile, $userfile_name και $userfile_size. Ο καθένας απ’ αυτούς θα είναι ένας πίνακας με αριθμητικούς δείκτες.

Για παράδειγμα, ας υποθέσουμε ότι υποβάλλονται τα αρχεία /home/test/review.html και /home/test/xwp.out. Σ’ αυτήν την περίπτωση, το $userfile_name[0] θα περιέχει την τιμή review.html και το $userfile_name[1] θα περιέχει την τιμή xwp.out. Παρόμοια, το $userfile_size[0] θα περιέχει το μέγεθος αρχείου του review.html κοκ.

 

Υποστήριξη για τη Μέθοδο PUT

Η PHP παρέχει υποστήριξη για τη μέθοδο PUT του HTTP που χρησιμοποιείται από πελάτες (clients) όπως ο Netscape Composer και ο W3C Amaya. Οι αιτήσεις (requests) της PUT είναι πολύ απλούστερες από το upload ενός αρχείου και μοιάζουν ως εξής :

PUT /path/filename.html HTTP/1.1

Αυτό σημαίνει συνήθως ότι ο απομακρυσμένος πελάτης θα ήθελε να αποθηκεύσει τα περιεχόμενα ως εξής : /path/filename.html. Δεν αποτελεί προφανώς μια καλή ιδέα για το Apache ή την PHP να επιτρέπουν στον οποιονδήποτε να επικαλύπτει αρχεία στο δικό μας web tree.

Έτσι, για να χειριστούμε μια τέτοια αίτηση (request) πρέπει πρώτα να πούμε στον web server ότι θέλουμε ένα συγκεκριμένο script της PHP να χειριστεί την αίτηση. Στο Apache το κάνουμε αυτό με την οδηγία (directive) Script, που μπορεί να τοποθετηθεί οπουδήποτε στο αρχείο σύνθεσης (configuration file) του Apache :

Script PUT /put.php3

Το παραπάνω λέει στο Apache να στείλει όλες τις αιτήσεις PUT για τα URIs που ταιριάζουν στο περιεχόμενο με το script put.php3. Αυτό προϋποθέτει, φυσικά, ότι έχουμε ενεργοποιήσει την PHP για την επέκταση .php3 και ότι είναι ενεργή η PHP.

Μέσα στο αρχείο put.php3, θα γράψουμε κάτι σαν το εξής :

<? copy($PHP_UPLOADED_FILE_NAME,

$DOCUMENT_ROOT.$REQUEST_URI); ?>

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

Το μόνο τρυκ εδώ είναι ότι όταν η PHP βλέπει μια αίτηση με την μέθοδο PUT, αποθηκεύει το αρχείο που γίνεται upload σ’ ένα προσωρινό αρχείο όπως ακριβώς εκείνα που χειρίζονται από την μέθοδο POST.

Όταν τελειώσει η αίτηση (request), διαγράφεται αυτό το προσωρινό αρχείο. Έτσι, το script της PHP που θα γράψουμε για την μέθοδο PUT πρέπει να αντιγράψει κάπου αλλού αυτό το αρχείο.

Το όνομα αυτού του προσωρινού αρχείου βρίσκεται στην μεταβλητή $PHP_PUT_FILENAME και μπορούμε να βρούμε το προτεινόμενο όνομα για το αρχείο προορισμού στην $REQUEST_URI, που είναι αυτό που καθόρισε ο απομακρυσμένος χρήστης, αλλά δεν είμαστε υποχρεωμένοι να το χρησιμοποιήσουμε. Θα μπορούσαμε, για παράδειγμα, να αντιγράψουμε όλα τα αρχεία που γίνονται upload σ’ έναν ειδικό κατάλογο uploads.

 

Χρήση Απομακρυσμένων Αρχείων

Μπορούμε να ανοίξουμε ένα αρχείο σ’ έναν απομακρυσμένο web server, αν αναλύσουμε (parse) την έξοδο για τα δεδομένα που θέλουμε και μετά να χρησιμοποιήσουμε αυτά τα δεδομένα σ’ ένα ερώτημα μιας βάσης δεδομένων (database query) ή να τα εξάγουμε στο δικό μας website.

Το επόμενο παράδειγμα εμφανίζει τον τίτλο (title) μιας απομακρυσμένης σελίδας.

<?php

$file = fopen("http://www.php.net/", "r");

if (!$file) {

echo "<p>Unable to open remote file.\n";

exit;

}

while (!feof($file)) {

$line = fgets($file, 1024);

/* This only works if the title and its tags are on one line. */

if (eregi("<title>(.*)</title>", $line, $out)) {

$title = $out[1];

break;

}

}

fclose($file);

?>

Το επόμενο παράδειγμα αποθηκεύει δεδομένα σ’ έναν απομακρυσμένο server.

<?php

$file = fopen("ftp://ftp.php.net/incoming/outputfile", "w");

if (!$file) {

echo "<p>Unable to open remote file for writing.\n";

exit;

}

/* Εδώ καταχωρούμε τα δεδομένα */

fputs($file, "$HTTP_USER_AGENT\n");

fclose($file);

?>

 

back.gif (9867 bytes)

Επιστροφή