Μεταβλητές και συναρτήσεις static
Ένα μέλος (μεταβλητή ή συνάρτηση) μιας κλάσης μπορεί να χαρακτηριστεί ως static.
Κάθε static μέλος έχει δύο βασικά χαρακτηριστικά.
- Η πρόσβασή του είναι άμεση χωρίς να χρειαστεί πρώτα να δημιουργηθεί κάποιο αντικείμενο.
- Όλα τα αντικείμενα που έχουν δημιουργηθεί με βάση μια συγκεκριμένη κλάση, μοιράζονται τα
staticμέλη της κλάσης. Δηλαδή μιαstaticμεταβλητή για παράδειγμα είναι κοινή για όλα τα αντικείμενα της κλάσης.
Έτσι, αν για παράδειγμα αλλάξει η τιμή της μεταβλητής, τότε αυτή η τιμή περνάει σε όλα τα αντικείμενα που έχουν δημιουργηθεί με βάση αυτή την κλάση.
Σε ένα πιο πρακτικό παράδειγμα μπορεί να έχουμε μια κλάση έστω Product που περιέχει μια static μεταβλητή έστω $fpa στην οποία αποθηκεύεται η τιμή του Φ.Π.Α. και η οποία είναι ίδια για όλα τα προϊόντα. Αν τώρα αλλάξει η τιμή του φπα, απλά αλλάζουμε την τιμή της static $fpa και επειδή είναι κοινή για όλα τα προϊόντα, όλα τα προϊόντα έχουν αυτόματα ενημερωθεί.
Ένα static μέλος μπορεί να είναι public, private ή ptotected.
Τέλος, η αναφορά σε ένα static μέλος, μέσα από την κλάση, γίνεται με τη λέξη self:: αντί της $this->.
Σε νεότερες εκδόσεις της php μπορείτε να χρησιμοποιήσετε και την static:: αντί της self::.
Το παρακάτω παράδειγμα δείχνει πως μπορείτε να έχετε πρόσβαση σε μια static μεταβλητή χρησιμοποιώντας το όνομα της κλάσης ή με τη χρήση αντικειμένου.
<?php class Product { public static $fpa = 23; } echo Product::$fpa; //άμεση πρόσβαση χωρίς δημιουργία αντικειμένου $p = new Product(); echo $p::$fpa; //πρόσβαση μέσω αντικειμένου ?>
Χρησιμοποιούμε τον τελεστή :: για την πρόσβαση της μεταβλητής.
Επειδή χρησιμοποιούμε το όνομα της κλάσης και μετά το όνομα του static μέλους, τα static μέλη λέγονται και class members.
Το παρακάτω παράδειγμα δείχνει πως διαφορετικά αντικείμενα μοιράζονται την ίδια static μεταβλητή.
<?php class Product { static $fpa=23; function get_fpa() { return static::$fpa; } } $milk = new Product(); $bread = new Product(); echo $milk->get_fpa(), " - ", $bread->get_fpa(), "<br />"; Product::$fpa = 19; echo $milk->get_fpa(), " - ", $bread->get_fpa(); ?>
23 – 23 19 – 19