Τι είναι οι Μέθοδοι (functions);

Οι μέθοδοι (η αλλιώς και συναρτήσεις, functions στα αγγλικά) υπάρχουν σχεδόν σε όλες τις γλώσσες προγραμματισμού. Στην php υπάρχουν τόσο εσωτερικές μέθοδοι της ίδιας της php όσο και εξωτερικές από πρόσθετες λειτουργίες. Εκτός από τα δυο παραπάνω είδη μεθόδων υπάρχουν και οι ορισμένες από τον προγραμματιστή μέθοδοι οι οποίες εκτελούν ένα μικρό (ή και σε μερικές περιπτώσεις μεγάλο) σύνολο εντολών. Το σύνολο αυτό διατηρείται και εκτελείται αυτόνομα για όσες φορές εμείς το χρειαστούμε, καθώς κάθε μέθοδος διαθέτει και ένα όνομα. Κάθε μέθοδος προαιρετικά μπορεί να παίρνει κάποια είσοδο τιμών κατά την εκτέλεση της και προαιρετικά επίσης μπορεί να επιστρέφει κάποιο αποτέλεσμα. Για να κατανοήσουμε όλα τα παραπάνω θα προσπαθήσουμε να προσεγγίσουμε τις μεθόδους με ένα παράδειγμα από την καθημερινότητα μας.

Καθημερινά στην ζωή μας τρώμε ψωμί γιατί είναι απαραίτητο για την διατροφή μας. Για να κατασκευάσουμε ψωμί θα χρειαζόμασταν αλεύρι, μαγιά, νερό, αλάτι και μπόλικο χρόνο για να μπορέσουμε να το παρασκευάσουμε. Θα πρέπει να ανακατέψουμε τα συστατικά, να ζυμώσουμε την ζύμη μας και ύστερα να την ψήσουμε στον φούρνο περιμένοντας να γίνει. Φανταστείτε τώρα πως για όλη αυτή την διαδικασία υπάρχει μια έτοιμη μηχανή η οποία δέχεται ως είσοδο όλα τα συστατικά (αλεύρι, μαγιά, νερό, αλάτι) και παρασκευάζει αυτόματα το ψωμί περνώντας από όλα τα στάδια παρασκευής του (ανακάτεμα, ζύμωμα, ψήσιμο). Στο τέλος μας «επιστρέφει» το έτοιμο προς κατανάλωση ψωμί. Αυτή την συσκευή μπορούμε να την παρομοιάσουμε με μια μέθοδο, τα υλικά που παίρνει η συσκευή, ως οι παράμετροι εισόδου της μεθόδου, και το αποτέλεσμα που μας αποφέρει, δηλαδή το ψωμί, ως την έξοδο αυτής της μεθόδου (η αλλιώς το αποτέλεσμα της).

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

Δημιουργία μεθόδου

Φανταστείτε τις μεθόδους (ή αλλιώς functions) σαν εργαλεία τα οποία βρίσκονται τοποθετημένα σε διάφορα ράφια. Όταν εσείς χρειάζεστε ένα εργαλείο, το αναζητείτε με βάση το όνομα του, π.χ. τρυπάνι. Ένα τρυπάνι όμως για να λειτουργήσει χρειάζεται μια πηγή ενέργειας, π.χ. μια μπαταρία, και μια κεφαλή. Στον προγραμματισμό χρησιμοποιούμε την ίδια λογική, το μόνο που αλλάζει είναι ο τρόπος με το οποίο το κάνουμε. Αν το τρυπάνι ήταν «function» ή σύνταξη του θα είχε ως εξής:

function tripani($mpataria, $kefalh){
 //Χρήση τρυπανιού
 return true;
}

Όπως παρατηρούμε υπάρχουν σημαντικά σημεία σύνταξης:

  1. Όλες οι μέθοδοι έχουν ένα όνομα και στην συγκεκριμένη περίπτωση είναι το «tripani». Κάθε όνομα πρέπει να είναι ένα οποιοδήποτε αλφαριθμητικό ξεκινώντας με ένα γράμμα ή κάτω παύλα, και στην συνέχεια μπορεί να συνεχίζεται με κάτω παύλες, γράμματα ή αριθμούς. Δεν μπορεί ένα όνομα μεθόδου να ξεκινά με αριθμό. Οι μέθοδοι διακρίνονται μέσω τον ονομάτων που έχουν, και είναι αυστηρά σημαντικό κάθε μέθοδος να έχει διαφορετική ονομασία από κάποια άλλη ώστε να αποφευχθούν σφάλματα στην χρήση τους. Τα ονόματα των μεθόδων είναι case-insensitive, αυτό σημαίνει πως μια μέθοδο με το όνομα «tripani» είναι ίδια με την «TriPani» ή «TRIPANI».
  2. Πριν το όνομα της μεθόδου πρέπει υπάρχει η λέξη «function».
  3. Μαζί με το όνομα της μεθόδου υπάρχει ΠΑΝΤΟΝΤΕ και ένα ζεύγος παρενθέσεων «()».
  4. Μέσα στις παρενθέσεις μπορούν να υπάρχουν προαιρετικά ορίσματα εισόδου ή αλλιώς παράμετροι της μεθόδου, στην περίπτωση μας είναι τα $mpataria, $kefalh.
  5. Το σύνολο των εντολών που θα εκτελεστούν από την μέθοδο κλείνονται μέσα σε αγκύλες «{…}».
  6. Όλες οι μέθοδοι επιστρέφουν συνήθως κάτι ως αποτέλεσμα των πράξεων τους, επομένως το «return» είναι η εντολή (η οποία βρίσκεται μέσα στις αγκύλες) που καθορίζει το τι θα επιστρέψει η μέθοδος από εκεί που θα την καλέσουμε.
  7. Μπορούμε να έχουμε πολλές μεθόδους γραμμένες μέσα στο ίδιο script ή ακόμη και σε διαφορετικά συμπεριλαμβάνοντας τα από διαφορετικές πηγές.
  8. Οι εντολές που περιέχει μια μέθοδος εκτελούνται όταν την καλέσουμε με το όνομα της.
  9. Κάθε μέθοδος μπορεί να εκτελεστεί άπειρες φορές μέσα σε ένα script.

Ας υποθέσουμε πως θέλουμε να φτιάξουμε μια μέθοδο η οποία να επιστρέφει το άθροισμα δυο, ορισμένων αριθμών - παραμέτρων. Ο κώδικας που προκύπτει είναι ο εξής:

<?php
 function prosthesi($a,$b){
  return ($a+$b);
 }

 $arithmosa = 5;
 $arithmosb = 25;

 echo prosthesi($arithmosa,$arithmosb);
?>

Όπως βλέπουμε οι μεταβλητές $arithmosa και $arithmosb «μεταθέτουν» το περιεχόμενο τους στις μεταβλητές μεθόδου $a και $b. Έτσι μέσα στην μέθοδο η $arithmosa είναι η $a και η $arithmosb είναι η $b.

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

Όταν καλέσουμε την μέθοδο prosthesi στο τέλος του κώδικα μας δηλαδή στο echo, τότε θα εκτελεστεί με ορίσματα το 5 και το 25, όπου αν προσθέσουμε μας επιστρέφει 30, το οποίο και το αποτέλεσμα μας.

Αρχικές τιμές παραμέτρων

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

<?php
 function prosthesi($a,$b=20){
  return ($a+$b);
 }
 $arithmosa = 5;
 $arithmosb = 25;

 echo prosthesi($arithmosa,$arithmosb)."\n";
 echo prosthesi($arithmosa);
?>

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

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

Η εμβέλεια των μεταβλητών (ή αλλιώς variables scope) καθορίζει κατά πόσο μία μεταβλητή θα είναι προσπελάσιμη από άλλες μεθόδους και κλάσεις.

local

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

$vartest = "Κώστας";

Άν δηλώσουμε μια μεταβλητή στην εμβέλεια του global τότε μία function στην δικιά της εμβέλεια δεν θα μπορεί να την «δει». Πχ.

<?php
 $a = 5; // global μεταβλητή;
 function myTest(){
  echo $a; // local μεταβλητή;
 }
 myTest();
?>

Όπως βλέπουμε και απο το αποτέλεσμα ενώ globally υπάρχει η μεταβλητή $a μέσα στον κώδικα της function αδυνατούμε να αποκτήσουμε πρόσβαση σε αυτήν διότι η function έχει πρόσβαση σε μια μεμονωμένη εμβέλεια (scope).

global

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

global $vartest = "Γιάννης";

Δηλώνοντας μεταβλητές global μέσα σε μια function στην ουσία της υποδηλώνουμε να ανατρέξει αυτές τις μεταβλητές απο τις global του script μας. Είναι ωστόσο σημαντικό να δηλώσουμε ποιες θέλουμε να ανατρέξουμε ως global διότι αν γράψουμε απλά το όνομα μιας μεταβλητής μέσα στην function τότε θα δημιουργηθεί μια νέα μεταβλητή στο scope της εν λόγω function.

<?php
 //Μεταβλητές έξω απο την function οι οποίες
 //δεν ειναι προσπελάσιμες μέσα απο την function
 $a = 2;
 $b = 22; 
 $c = 0;
 
 function prosthesi(){
  //Δήλωση χρήσης των εξωτερικών μεταβλητών μέσα στην function
  global $a, $b, $c; 
  $c = $a + $b; 
 }
 
 prosthesi();
 echo $c;
?>

static

Οι μεταβλητές αυτές είναι δηλωμένες μέσα σε μια συνάρτηση, είναι προσπελάσιμες μέσα από αυτή και ζουν ακόμα κι αν τελειώσει την εκτέλεση της η συνάρτηση. Έτσι όταν ξανά κληθεί η ίδια συνάρτηση η static μεταβλητή διατηρεί την τιμή της. 

static $vartest = "Χρήστος";

Παρακάτω θα δούμε πως αφού δηλώσουμε την static μεταβλητή μας μέσα στην function, παρά που τρέχουμε με διαφορετικές τιμές στην παράμετρο την ίδια function ή μεταβλητή και το αποτέλεσμα της έχει παραμείνει απο την προηγούμενη φορά, επομένως όταν εκτελεστεί την πρώτη φορά η function θα κάνει το $a + $b τα οποια εκείνη την στιγμή έχουν τιμές 2 + 2 άρα το αποτέλεσμα ειναι 4 και αυτό το αποτέλεσμα θα καταχωρηθεί στην $a, έτσι την δεύτερη φορά που θα καλέσουμε την ίδια function δεν θα έχει αλλάξει μονο το $b που θα της δώσουμε αλλά και το $a απο την προηγούμενη εκτέλεση άρα θα έχουμε $a + $b τα οποία μεταφράζονται σε 4 + 3 = 7, άν η μεταβλητή $a δεν ήταν static τότε θα το αποτέλεσμα θα ήταν 2 + 3 = 5.

<?php 
 function prosthesi($b){
  static $a = 2;
  $a = $a+$b;
  return $a;
 }
 
 echo prosthesi(2);
 echo "<br/>";
 echo prosthesi(3);
?>