Συναρτήσεις / Functions

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

Στον προγραμματισμό είναι ιδιαίτερα σημαντικό να κάνουμε οικονομία στις γραμμές κώδικα. Αυτό συμβαίνει για τους εξής λόγους:

  1. Όσο πιο μεγάλο σε γραμμές κώδικα είναι το πρόγραμμά σας, τόσο πιο δύσκολα θα το διαχειρίζεστε. Εάν για παράδειγμα δουλεύετε ένα πρόγραμμα το οποίο έχει 8000 γραμμές κώδικα, όπως καταλαβαίνετε για να συνεχίσετε την ανάπτυξή του, περισσότερο χρόνο θα σπαταλήσετε στη περιήγησή σας στις χιλιάδες γραμμές κώδικα παρά στην ουσιαστική ανάπτυξή του.
  2. Μεγάλο πρόγραμμα σημαίνει κόστος σε ταχύτητα εκτέλεσής του.
  3. Περισσότερες απαιτήσεις σε χωρητικότητα μνήμης RAM.

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

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

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

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

Μια συνάρτηση δημιουργείται με την εντολή function και ακολουθεί το όνομα της συνάρτησής μας. Η function σημαίνει την αρχή του κώδικα της συγκεκριμένης συνάρτησης. Τον κώδικα της συνάρτησης τον τοποθετούμε μεταξύ των αγκίστρων { }. Στο ενδιάμεσο τοποθετούμε τις εντολές που επιθυμούμε να εκτελούνται όταν καλούμε την συνάρτηση.

Πώς δημιουργούμε μια συνάρτηση

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

Για τις συναρτήσεις ισχύουν τα εξής:

  • Κάθε συνάρτηση πρέπει να φέρει ένα συγκεκριμένο και μοναδικό όνομα (π.χ.: myFunction())
  • Η λέξη function πρέπει να προηγείται του ονόματος μιας συνάρτησης (π.χ.: function myFunction())
  • Κάθε όνομα συνάρτησης ακολουθείται από ένα ζεύγος παρενθέσεων (π.χ.: function myFunction())
  • Το σετ των εντολών κάθε συνάρτησης περιέχεται στα άγκιστρα { και }. (π.χ.: function myFunction() { . . . })
  • Κάθε συνάρτηση καλείται με το όνομά της (π.χ.: myFunction())
  • Οι εντολές που περιέχει μια συνάρτηση εκτελούνται όταν η συνάρτηση κληθεί με το ονομά της
  • Κάθε συνάρτηση μπορεί να κληθεί άπειρες φορές μέσα από ένα πρόγραμμα
  • Κάθε αρχείο php μπορεί να περιέχει περισσότερες της μίας συναρτήσεις

Η γενική μορφή μιας συνάρτησης είναι:

function myFunction()
{
 ...
}

Παράδειγμα

Στο ακόλουθο απλό παράδειγμα έχει οριστεί μια συνάρτηση με το όνομα hello() η οποία εκτελείται κάθε φορά που καλείται.

<?php

 function hello()
 {
    echo("Καλώς ορίσατε στη σελίδα μου");
 }

 hello();

?>

Κατά την εκτέλεση θα εμφανίσει:

Καλώς ορίσατε στη σελίδα μου

Σημείωση Όταν καλείτε τη συνάρτηση με το όνομά της θα πρέπει να μην ξεχνάτε και τις παρενθέσεις π.χ. hello() και όχι hello.

Συναρτήσεις με παραμέτρους

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

Γενικά:

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

Στο παράδειγμα αυτό, κάθε φορά που καλείται η hello με διαφορετική τιμή παραμέτρου, εμφανίζεται το αντίστοιχο μήνυμα.

<?php

 function hello($name)
 {
   echo "Hello $name, how are you?";
 }

 hello("Bill");
 hello("Steve");


?>

Κατά την εκτέλεση θα εμφανίσει στην οθόνη:

Hello Bill, how are you?
Hello Steve, how are you?

Επειδή η συνάρτηση του παραδείγματος είναι παραμετρική, κάθε φορά που καλείται, θα πρέπει να αναφέρεται (μέσα στις παρενθέσεις) και η τιμή της παραμέτρου. Η τιμή της παραμέτρου μπορεί να είναι τύπου string ή τύπου integer ή όποιουδήποτε άλλου τύπου που υποστηρίζει η php.

Στο παρακάτω παράδειγμα η συνάρτηση doubleit() υπολογίζει το διπλάσιο ενός αριθμού. Έτσι, αν κληθεί ως doubleit(10) θα δώσει σαν αποτέλεσμα το 20.

<?php

 function doubleit($x)
 {
   echo(2 * $x);
 }

 doubleit(10);

?>

Αποτέλεσμα:

20

Παρατήρηση

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

Συναρτήσεις που επιστρέφουν τιμές

Υπάρχουν περιπτώσεις που ζητάμε από μια συνάρτηση να επιστρέφει μια τιμή ως αποτέλεσμα κάποιας επεξεργασίας. Στην περίπτωση αυτή χρησιμοποιούμε την πρόταση return.

Παράδειγμα

Στο παρακάτω παράδειγμα η συνάρτηση getNegative() επιστρέφει τον αντίθετο αριθμό που θα της ζητηθεί.

<?php
function getNegative($x)
{
   $z= -1 * $x;
   return $z;
}
?>

Ή αν προτιμάτε πιο σύντομα:

function getNegative($x)
{
   return -1 * $x;
}

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

<?php
function getNegative($x)
{
 if($x <= 0)
 {
    echo("Δώσατε αρνητικό αριθμό!");
    return;
  }
  
  $z = -1 * $x;
  
  return $z;
}
?>

Παράδειγμα

Όνομα αρχείου: getNegative.php

<?php
function getNegative($x)
{
	if($x <= 0)
	{
		echo("Ο αριθμός που δώσατε είναι αρνητικός.");
	}
	else
	{
		$z = -1 * $x;
		return $z;
	}
}

echo getNegative(15);
?>

Αποτέλεσμα:

-15

Στο παραπάνω παράδειγμα, δηλώνουμε έναν θετικό αριθμό στην getNegative και μας επιστρέφει τον αρνητικό του. Δηλώσαμε getNegative(15) και μας επέστρεψε -15. Αν δοκιμάσετε να δηλώσετε αρνητικό αριθμό στην getNegative π.χ. getNegative(-15), τότε θα εμφανίσει το μήνυμα Ο αριθμός που δώσατε είναι αρνητικός.

Επειδή η function getNegative επιστρέφει μια τιμή -συγκεκριμένα το περιεχόμενο της $z– για να εμφανίσουμε το περιεχόμενο που επιστρέφει χρησιμοποιούμε την echo η οποία εμφανίζει ένα μήνυμα στην οθόνη. Συνεπώς θα εμφανίσει το περιεχόμενο της $z που είναι -15.

Αρχικοποίηση των παραμέτρων

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

<?php
function add($a, $b=20)  //Αρχικοποιούμε την παράμετρο $b με την τιμή 20.
{
    return ($a + $b);
}

$number1 = 5;
$number2 = 15;

echo add($number1, $number2);
echo "<br>";
echo add($number1);  // Σε αυτή την περίπτωση επειδή δεν δηλώνουμε τιμή για την 2η παράμετρο,
                  // αυτομάτως παίρνει την τιμή που αρχικοποιήθηκε κατά την δημιουργία
                  // της function add($a, $b=20) η οποία είναι 20.

?>

Αποτέλεσμα

20
25

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

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

Τοπικές Μεταβλητές / Local Variables

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

<?php
$a = 10;  // Global variable

function foo()
{
    $a = 20;  // Τοπική μεταβλητή
    echo $a; 
}

foo();
?>

Αποτέλεσμα:

20

Βλέπουμε ότι στο παραπάνω παράδειγμα, η $a έχει δηλωθεί σε δύο σημεία του προγράμματός μας. Μια φορά εκτός της συνάρτησης (γραμμή 2) με την τιμή 10, και μια ακόμα που ορίστηκε εντός της συνάρτησης foo() (γραμμή 6), η οποία παίρνει την τιμή 20. Κατά την εκτέλεση του προγράμματος βλεπουμε πως εμφανίζεται ο αριθμός 20 που είναι το περιεχόμενο της $a η οποία έχει οριστεί εντός της συνάρτησης (γραμμή 6). Δεν εμφανίζεται ο αριθμός 10 που ορίστηκε στην $a που βρίσκεται εκτός της συνάρτησης (γραμμή 2).

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

Global variables

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

global $myvar = "Bill";

Στο παρακάτω παράδειγμα, δηλώνοντας μεταβλητές global μέσα σε μια function, στην ουσία λέμε στην php να “δει” τις τιμές των μεταβλητών που είναι global. Δηλαδή, τις μεταβλητές που βρίσκονται εκτός της function. Αυτός είναι ένας τρόπος που χρησιμοποιούμε για να περνάμε τιμές απο έξω στο εσωτερικό των functions.

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

Αποτέλεσμα:

24

Static

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

static $myvar = 'Bill';

Όνομα αρχείου: static.php

<?php 
function add($b)
{
    static $a = 2;
    $a = $a + $b;

    return $a;
}

echo add(2);
echo "<br/>";
echo add(3);
?>

Αποτέλεσμα:

4
7