Php7 - PHP: η καθολική μέσα σε μια συνάρτηση δεν εμφανίζει μεταβλητή - Υπερχείλιση στοίβας στα Ρωσικά. Πεδίο εφαρμογής μεταβλητών PHP. Όλα όσα θέλατε να μάθετε αλλά φοβηθήκατε να ρωτήσετε Εκτύπωση μιας καθολικής μεταβλητής php εκτός συνάρτησης

Τελευταία ενημέρωση: 1/11/2015

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

Τοπικές μεταβλητές

Οι τοπικές μεταβλητές δημιουργούνται μέσα σε μια συνάρτηση. Τέτοιες μεταβλητές είναι προσβάσιμες μόνο μέσα από μια δεδομένη συνάρτηση. Για παράδειγμα:

Σε αυτήν την περίπτωση, η συνάρτηση get() ορίζει μια τοπική μεταβλητή $result . Και από το γενικό πλαίσιο δεν μπορούμε να έχουμε πρόσβαση, δηλαδή να γράψουμε $a = $result; Αυτό δεν είναι δυνατό επειδή το εύρος της μεταβλητής $result περιορίζεται από τη συνάρτηση get(). Εκτός αυτής της συνάρτησης, η μεταβλητή $result δεν υπάρχει.

Το ίδιο ισχύει για τις παραμέτρους συνάρτησης: εκτός της συνάρτησης, οι παράμετροι $lowlimit και $highlimit επίσης δεν υπάρχουν.

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

Στατικές Μεταβλητές

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

Για να υποδείξετε ότι μια μεταβλητή θα είναι στατική, προστίθεται σε αυτήν η λέξη-κλειδί στατική. Με τρεις διαδοχικές κλήσεις στο getCounter(), η μεταβλητή $counter θα αυξηθεί κατά μία.

Εάν η μεταβλητή $counter ήταν μια κανονική μη στατική μεταβλητή, τότε η getCounter() θα τύπωνε 1 κάθε φορά που καλούνταν.

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

Καθολικές μεταβλητές

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

"; ) getGlobal(); echo $gvar; ?>

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

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

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

  • Μέσα στη συνάρτηση, μπορείτε να χρησιμοποιήσετε οποιονδήποτε κώδικα PHP (κύκλους, συνθήκες, οποιεσδήποτε λειτουργίες), συμπεριλαμβανομένων άλλων συναρτήσεων (τόσο ενσωματωμένες όσο και προσαρμοσμένες).
  • Το όνομα της συνάρτησης πρέπει να ξεκινά με λατινικό γράμμα ή κάτω παύλα, ακολουθούμενο από οποιονδήποτε αριθμό λατινικών γραμμάτων, αριθμών ή υπογράμμισης.
  • Όλες οι συναρτήσεις έχουν καθολική εμβέλεια, πράγμα που σημαίνει ότι οποιαδήποτε συνάρτηση μπορεί να κληθεί οπουδήποτε, ακόμα κι αν αυτή η συνάρτηση ορίζεται σε μια άλλη.
  • Η PHP δεν υποστηρίζει υπερφόρτωση συναρτήσεων, δεν υπάρχει επίσης δυνατότητα επαναπροσδιορισμού (αλλαγής, προσθήκης) ή διαγραφής μιας δημιουργημένης συνάρτησης.
  • Οι λειτουργίες δεν χρειάζεται να καθοριστούν πριν χρησιμοποιηθούν. Δηλαδή, εάν πρώτα καλέσετε μια συνάρτηση και μόνο μετά την περιγράψετε στον παρακάτω κώδικα, αυτό δεν θα επηρεάσει την απόδοση και δεν θα προκαλέσει σφάλματα.

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

Μπορούμε να δημιουργήσουμε (να ορίσουμε, να περιγράψουμε) μια συνάρτηση ανάλογα με την συνθήκη. Για παράδειγμα:

//ονομάζεται η συνάρτηση sayHi, μπορεί να κληθεί οπουδήποτε /*η συνάρτηση sayGoodbye δεν μπορεί να κληθεί εδώ, καθώς δεν έχουμε ελέγξει ακόμα τη συνθήκη και δεν έχουμε μπει μέσα στην κατασκευή if*/ if($apply)( συνάρτηση sayGooodbye())( echo "Αντίο σε όλους!
"; } } /*Τώρα μπορούμε να καλέσουμε το «Αντίο»*/
"; }

Αποτέλεσμα:

Και ρίξτε μια ματιά σε αυτό το παράδειγμα:

/*και αυτό θα συμβεί αν καλέσετε το sayGoodbye εδώ*/πες αντίο(); if($apply)( συνάρτηση sayGooodbye())( echo "Αντίο σε όλους!
"; ) ) συνάρτηση sayHi())( echo "Γεια σε όλους!
"; }

Αποτέλεσμα:

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

Ένθετες συναρτήσεις

Μια ένθετη συνάρτηση είναι μια συνάρτηση που δηλώνεται μέσα σε μια άλλη συνάρτηση. Παράδειγμα:

/*Δεν μπορείτε να καλέσετε το sayGoodbye εδώ, καθώς θα εμφανιστεί μόνο μετά την κλήση της συνάρτησης sayHi*/πες γεια(); /*καλέστε τη συνάρτηση sayHi, μπορεί να κληθεί οπουδήποτε*/ /*Τώρα μπορούμε να καλέσουμε το say Goodbye*/πες αντίο(); συνάρτηση sayHi())( echo "Γεια σε όλους!
"; λειτουργία sayGoodbye())( echo "Αντίο σε όλους!
"; } }

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

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

Αλλά αξίζει να δώσετε προσοχή σε ένα πολύ λεπτό σημείο στην παραπάνω κατάσταση: η συνάρτηση sayHi γίνεται εφάπαξ, γιατί αν την καλέσουμε ξανά, η PHP θα συναντήσει ξανά τον ορισμό της συνάρτησης sayGoodbye και στην PHP δεν μπορείτε να κάνετε αυτό - δεν μπορείτε να παρακάμψετε λειτουργίες. Έγραψα για αυτό και πώς να το αντιμετωπίσω σε προηγούμενο άρθρο.

Στην PHP, οι τεχνικές που περιγράφονται παραπάνω χρησιμοποιούνται πολύ σπάνια· μπορούν να εμφανιστούν πιο συχνά, για παράδειγμα, σε JavaScript.

Μεταβλητό Πεδίο

Υπάρχουν ακριβώς δύο πεδία στην PHP: παγκόσμιαΚαι τοπικός. Κάθε γλώσσα προγραμματισμού δομεί διαφορετικά το πεδίο εφαρμογής. Για παράδειγμα, στη C++, ακόμη και οι βρόχοι έχουν το δικό τους (τοπικό) πεδίο. Στην PHP, παρεμπιπτόντως, αυτό είναι μια παγκόσμια εμβέλεια. Σήμερα όμως μιλάμε για λειτουργίες.

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

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

Αγαπητοί ειδικοί, προσοχή, ερώτηση! Τι θα βγει η τελευταία εντολή; echo $name; ?

Όπως είδατε και μόνοι σας, είχαμε 2 μεταβλητές $όνομα, το ένα μέσα στη συνάρτηση (τοπικό εύρος), το άλλο μόνο στον κώδικα (σφαιρικό εύρος), η τελευταία εκχώρηση σε μια μεταβλητή $όνομαήταν $name = "Rud Sergey";Αλλά επειδή ήταν μέσα στη λειτουργία, έμεινε εκεί. Σε παγκόσμια εμβέλεια, η τελευταία ανάθεση ήταν $name = "Andrey";που είναι αυτό που στην πραγματικότητα βλέπουμε ως αποτέλεσμα.

Δηλαδή δύο ίδιες μεταβλητές, αλλά σε διαφορετικά πεδία δεν τέμνονται και δεν επηρεάζουν η μία την άλλη.

Επιτρέψτε μου να δείξω το εύρος στο σχήμα:

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

Πρόσβαση σε καθολικές μεταβλητές από τοπική εμβέλεια

Τι γίνεται όμως αν χρειαζόμαστε ακόμα πρόσβαση στην ίδια μεταβλητή $name από το καθολικό εύρος από μια συνάρτηση, και όχι απλώς να έχουμε πρόσβαση, αλλά να την αλλάξουμε; Υπάρχουν 3 κύριες επιλογές για αυτό. Το πρώτο χρησιμοποιεί τη λέξη-κλειδί παγκόσμια:

"; καθολικό $name; /*από εδώ και πέρα ​​εννοούμε την καθολική μεταβλητή $name*/$name = "Rud Sergey"; ) $name = "Andrey"; sayHi($name); echo $name; // ?

Αποτέλεσμα:

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

Δεύτερος τρόποςείναι να χρησιμοποιήσετε PHP superglobal array. Η ίδια η PHP τοποθετεί αυτόματα κάθε μεταβλητή που δημιουργήσαμε στο καθολικό πεδίο εφαρμογής σε αυτόν τον πίνακα. Παράδειγμα:

$name = "Andrey"; //Το ίδιο με$GLOBALS["name"] = "Andrey";

Ως εκ τούτου:

"; $GLOBALS["name"] = "Rud Sergey"; ) $name = "Andrey"; sayHi($name); echo $name; // ?

Το αποτέλεσμα είναι το ίδιο με τη χρήση της λέξης-κλειδιού παγκόσμια:

Μόνο που αυτή τη φορά δεν ξαναγράψαμε την τοπική μεταβλητή, δηλαδή τη μεταβλητή $όνομαμέσα η συνάρτηση παραμένει ίδια και είναι ίση "Αντρέι", αλλά όχι "Ραντ Σεργκέι".

Διαβίβαση επιχειρημάτων με αναφορά

Τρίτος τρόπος– αυτή είναι η μεταφορά της διεύθυνσης ( συνδέσεις) μιας μεταβλητής, όχι της τιμής της. Οι σύνδεσμοι στην PHP δεν είναι πολύ επιτυχημένοι, σε αντίθεση με άλλες γλώσσες προγραμματισμού. Ωστόσο, θα σας πω τη μόνη σωστή επιλογή για τη μετάδοση ενός ορίσματος με αναφορά σε μια συνάρτηση, η οποία συνήθως υποστηρίζεται σε PHP 5.3 και μεταγενέστερη. Υπάρχουν άλλοι τρόποι εργασίας με συνδέσμους, αλλά λειτούργησαν σε PHP 5.2 και χαμηλότερες, ως αποτέλεσμα, οι ίδιοι οι προγραμματιστές της PHP αποφάσισαν να τους εγκαταλείψουν, οπότε δεν θα μιλήσουμε για αυτούς.

Έτσι, η ΣΩΣΤΗ μετάβαση ενός ορίσματος με αναφορά στην PHP 5.3 και νεότερη γίνεται ως εξής:

Συνάρτηση sayHi(& $name)(

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

Και στο τέλος έχουμε:

//αποδέχομαι όχι μια τιμή, αλλά μια αναφορά στην τιμή echo "Γεια σου, ".$name."!
"; $name = "Rud Sergey"; ) $name = "Andrey"; sayHi($name); echo $name; // ?

Αποτέλεσμα:

Στατικές Μεταβλητές

Φανταστείτε την εξής κατάσταση: πρέπει να μετρήσουμε πόσες φορές είπαμε ένα γεια συνολικά. Να τι προσπαθούμε να κάνουμε:

"; $c++; // αυξήστε τον μετρητή κατά 1


Αποτέλεσμα:

Μεταβλητός $cδεν θυμάται το νόημά του, δημιουργείται εκ νέου κάθε φορά. Πρέπει να κάνουμε την τοπική μας μεταβλητή $cθυμήθηκε την τιμή του μετά την εκτέλεση της συνάρτησης, γι' αυτό χρησιμοποιούν μια λέξη-κλειδί στατικός:

// μετρητής, γίνεται στατικός echo "Γεια σου, ".$name."!
"; $c++; // αυξήστε τον μετρητή κατά 1 echo "Μόλις είπε γεια". $c . " μια φορά.


"; ) sayHi ("Rud Sergey"); sayHi ("Andrey"); sayHi ("Dmitry");

Αποτέλεσμα:

Επιστρεφόμενες τιμές

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

Αποτέλεσμα:

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

Αποτέλεσμα:

Τώρα μπορούμε να το χρησιμοποιήσουμε με διάφορους τρόπους:

//εξάγει το αποτέλεσμαηχώ "
"; $num = getSquare(5); echo $num;

Αποτέλεσμα:

Σημειώστε ότι η λέξη-κλειδί ΕΠΙΣΤΡΟΦΗδεν επιστρέφει απλώς μια τιμή, αλλά διακόπτει εντελώς τη λειτουργία, δηλαδή όλο τον κώδικα που βρίσκεται κάτω από τη λέξη-κλειδί ΕΠΙΣΤΡΟΦΗδεν θα εκπληρωθεί ποτέ. Με άλλα λόγια, η επιστροφή για συναρτήσεις λειτουργεί επίσης όπως Διακοπήγια βρόχους:

echo "Η PHP δεν θα με φτάσει ποτέ:(";) echo getSquare(5); //εξάγει το αποτέλεσμαηχώ "
"; $num = getSquare(5); // εκχώρησε το αποτέλεσμα σε μια μεταβλητή echo $num; // εμφάνιση της μεταβλητής στην οθόνη

Αποτέλεσμα:

Αυτό είναι ΕΠΙΣΤΡΟΦΗ– αυτή είναι επίσης μια έξοδος από τη λειτουργία. Μπορεί να χρησιμοποιηθεί χωρίς επιστρεφόμενη τιμή, μόνο για χάρη της παραγωγής.

Αναδρομική συνάρτηση

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

"; if($number< 20){ // για να μην γίνει ατελείωτη η αναδρομή countPlease(++$number); // η συνάρτηση countPlease κάλεσε τον εαυτό της) ) countPlease(1);

Αποτέλεσμα:

Εάν ξέρετε πώς να κάνετε χωρίς αναδρομή, τότε είναι καλύτερα να το κάνετε.

Ισχυρή πληκτρολόγηση σε PHP (βελτίωση τύπου)

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

Αποτέλεσμα:

Καταλήξιμο μοιραίο σφάλμα: Το όρισμα 1 μεταβιβάστηκε στο countPlease() πρέπει να είναι ένας πίνακας, δίνεται ακέραιος, καλείται στο /home/index.php στη γραμμή 7 και ορίζεται στο /home/index.php στη γραμμή 3

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

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

Ονομάζεται συνάρτηση getEcho

Χρησιμοποιώντας επιχειρήματα μεταβλητού μήκους

Και τέλος, μια ακόμη πολύ σπάνια χρησιμοποιούμενη απόχρωση. Φανταστείτε μια κατάσταση: περνάμε ορίσματα σε μια συνάρτηση, αν και δεν τα περιγράψαμε στη συνάρτηση, για παράδειγμα:

Αποτέλεσμα:

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

func_num_args()- Επιστρέφει τον αριθμό των ορισμάτων που μεταβιβάστηκαν στη συνάρτηση
func_get_arg (αριθμός ακολουθίας)- Επιστρέφει ένα στοιχείο από μια λίστα ορισμάτων
func_get_args()- Επιστρέφει έναν πίνακα που περιέχει τα ορίσματα συνάρτησης

"; echo func_get_arg(0) ; ) $age = 22; getEcho("Rud Sergey", $age);

Αποτέλεσμα:

συμπέρασμα

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

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

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

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

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

Τι είναι το πεδίο εφαρμογής;

Το εύρος των μεταβλητών είναι το πλαίσιο εντός του οποίου ορίστηκε η μεταβλητή και όπου μπορεί να προσπελαστεί. Η PHP έχει δύο μεταβλητά πεδία:

  • Παγκόσμια- Οι μεταβλητές είναι προσβάσιμες οπουδήποτε στο σενάριο
  • Τοπικός- Οι μεταβλητές είναι προσβάσιμες μόνο μέσα στη συνάρτηση στην οποία ορίστηκαν

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

Οι μεταβλητές με καθολικό εύρος ονομάζονται καθολικές και οι μεταβλητές με τοπικό εύρος ονομάζονται τοπικές.

Ακολουθεί ένα παράδειγμα του πώς λειτουργούν οι καθολικές και οι τοπικές μεταβλητές.

"; ) sayHello(); echo "Τιμή του \$globalName: "$globalName"
"; echo "\$localName value: "$localName"
"; ?>

Γεια σου Χάρι! Τιμή $globalName: "Zoe" Τιμή $localName: ""

Σε αυτό το σενάριο δημιουργήσαμε δύο μεταβλητές:

  • $globalName- Αυτό παγκόσμιαμεταβλητός
  • $localName- Αυτό τοπικόςμια μεταβλητή που δημιουργείται μέσα στη συνάρτηση sayHello().

Μετά τη δημιουργία της μεταβλητής και της συνάρτησης, το σενάριο καλεί την sayHello(), η οποία εκτυπώνει "Hello Harry!" . Στη συνέχεια, το σενάριο προσπαθεί να εξάγει τις τιμές των δύο μεταβλητών χρησιμοποιώντας τη συνάρτηση echo. Να τι συμβαίνει:

  • Επειδή $globalNameδημιουργήθηκε εκτός της συνάρτησης, είναι διαθέσιμο οπουδήποτε στο σενάριο, οπότε βγαίνει το "Zoe".
  • $localNameθα είναι διαθέσιμο μόνο μέσα στη συνάρτηση sayHello(). Δεδομένου ότι η έκφραση echo βρίσκεται εκτός της συνάρτησης, η PHP δεν παρέχει πρόσβαση στην τοπική μεταβλητή. Αντίθετα, η PHP αναμένει από τον κώδικα να δημιουργήσει μια νέα μεταβλητή που ονομάζεται $localName , η οποία θα έχει μια προεπιλεγμένη τιμή της κενή συμβολοσειράς. γι' αυτό η δεύτερη κλήση στο echo εξάγει την τιμή "" για τη μεταβλητή $localName.

Πρόσβαση σε καθολικές μεταβλητές μέσα σε μια συνάρτηση

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

Συνάρτηση myFunction() ( καθολική $globalVariable; // Πρόσβαση στην καθολική μεταβλητή $globalVariable )

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

Ακολουθεί ένα παράδειγμα σεναρίου που χρησιμοποιεί μια καθολική μεταβλητή μέσα σε μια συνάρτηση:

"; καθολική $globalName; echo "Γεια σας $globalName!
"; ) sayHello(); ?>

Όταν εκτελεστεί, το σενάριο θα βγει:

Γεια σου Χάρι! Γεια σου Zoya!

Η συνάρτηση sayHello() χρησιμοποιεί την καθολική λέξη-κλειδί για να δηλώσει τη μεταβλητή $globalName ως καθολική. Στη συνέχεια, μπορεί να έχει πρόσβαση στη μεταβλητή και να εξάγει την τιμή της («Zoe»).

Τι είναι τα superglobals;

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

Ακολουθεί μια λίστα με τα superglobals διαθέσιμα στην έκδοση 5.3 της PHP:

  • $GLOBALS - λίστα με όλες τις καθολικές μεταβλητές στο σενάριο (εξαιρουμένων των υπερσφαιρικών)
  • $_GET - περιέχει μια λίστα με όλα τα πεδία φόρμας που υποβάλλονται από το πρόγραμμα περιήγησης χρησιμοποιώντας ένα αίτημα GET
  • $_POST - περιέχει μια λίστα με όλα τα πεδία φόρμας που αποστέλλονται από το πρόγραμμα περιήγησης χρησιμοποιώντας ένα αίτημα POST
  • $_COOKIE - περιέχει μια λίστα με όλα τα cookies που αποστέλλονται από το πρόγραμμα περιήγησης
  • $_REQUEST - περιέχει όλους τους συνδυασμούς κλειδιών/τιμών που περιέχονται στους πίνακες $_GET, $_POST, $_COOKIE
  • $_FILES - περιέχει μια λίστα με όλα τα αρχεία που λήφθηκαν από το πρόγραμμα περιήγησης
  • $_SESSION - σας επιτρέπει να αποθηκεύετε και να χρησιμοποιείτε μεταβλητές περιόδου λειτουργίας για το τρέχον πρόγραμμα περιήγησης
  • $_SERVER - περιέχει πληροφορίες σχετικά με τον διακομιστή, όπως το όνομα αρχείου του σεναρίου που εκτελείται και τη διεύθυνση IP του προγράμματος περιήγησης.
  • $_ENV - περιέχει μια λίστα μεταβλητών περιβάλλοντος που μεταβιβάζονται στην PHP, όπως μεταβλητές CGI.
Για παράδειγμα, μπορείτε να χρησιμοποιήσετε το $_GET για να λάβετε τις τιμές των μεταβλητών που περικλείονται στη συμβολοσειρά URL αιτήματος ενός σεναρίου και να τις εμφανίσετε στη σελίδα:

Εάν εκτελέσετε το παραπάνω σενάριο χρησιμοποιώντας τη διεύθυνση URL http://www.example.com/script.php?yourName=Fred, θα βγει:

Γεια σου Fred!

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

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

"; ) sayHello(); // Εκτυπώνει "Hello, Zoya!" ?>

Στατικές μεταβλητές: βρίσκονται κάπου γύρω

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

Στις περισσότερες περιπτώσεις αυτό λειτουργεί εξαιρετικά. Έτσι, οι συναρτήσεις είναι αυτόνομες και λειτουργούν πάντα το ίδιο κάθε φορά που καλούνται.

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

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

Συνάρτηση myFunction() ( στατική $myVariable = 0; )

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


"; echo createWidget() . " έχουμε ήδη δημιουργήσει.
"; echo createWidget() . " έχουμε ήδη δημιουργήσει.>
"; ?>

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

Δημιουργούμε μερικά widget... Έχουμε ήδη δημιουργήσει 1. Έχουμε ήδη δημιουργήσει 1. Έχουμε ήδη δημιουργήσει 1.

Αλλά χρησιμοποιώντας μια στατική μεταβλητή, μπορούμε να αποθηκεύσουμε την τιμή από μια κλήση συνάρτησης σε μια άλλη:

"; echo createWidget() . " έχουμε ήδη δημιουργήσει.
"; echo createWidget() . " έχουμε ήδη δημιουργήσει.
"; echo createWidget() . " >έχουμε ήδη δημιουργήσει.
"; ?>

Τώρα το σενάριο θα παράγει το αναμενόμενο αποτέλεσμα:

Δημιουργούμε μερικά widget... Έχουμε ήδη δημιουργήσει 1. Έχουμε ήδη δημιουργήσει 2. Έχουμε ήδη δημιουργήσει 3.

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

Αυτό είναι όλο! Ανατρέξτε συχνά στην τεκμηρίωσή σας στην PHP.

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

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

Ποιο ειναι το πρόβλημα?

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

Εάν συμπεριλάβετε στο καθολικό εύρος, τότε η μεταβλητή lang θα γίνει δημόσια (καθολική) και θα καταστεί δυνατή η χρήση της. Αυτό είναι εύκολο να το ελέγξετε· στο περιλαμβανόμενο αρχείο, πριν ξεκινήσετε να ορίζετε οποιαδήποτε μεταβλητή, απλώς γράψτε καθολική μεταβλητή $.

Παράδειγμα:

περιλαμβάνει "file1.php"? συνάρτηση include2() (περιλαμβάνει "file2.php"; )
  • Το file1.php ορίζεται σε καθολική εμβέλεια.
  • Το file2.php ορίζεται στο τοπικό πεδίο της συνάρτησης include2.

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

Γιατί είναι κακή η προσέγγιση με καθολικές μεταβλητές;

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

Ας υποθέσουμε ότι έχετε μια συνάρτηση της οποίας το αποτέλεσμα εξαρτάται από μια καθολική μεταβλητή. Το καλείτε, το καλείτε, αλλά μετά από 10 λεπτά η λειτουργία αρχίζει να επιστρέφει λανθασμένα αποτελέσματα. Τι συνέβη? Τελικά, του μεταβιβάζετε το ίδιο σύνολο παραμέτρων ως είσοδο; Χμμ, κάποιος άλλαξε την τιμή μιας καθολικής μεταβλητής... Ποιος θα μπορούσε να είναι; Ναι, οποιοσδήποτε - τελικά, μια καθολική μεταβλητή είναι διαθέσιμη σε όλους..

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

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

Γνωρίζετε ποιο είναι το καλύτερο πρόθεμα για καθολικές μεταβλητές;

Μεταβλητές που ορίζονται σε μια υπορουτίνα (συνάρτηση που ορίζεται από το χρήστη). Είναι προσβάσιμα μόνο εντός της συνάρτησης στην οποία έχουν οριστεί.

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

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

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

$a = 100 ;

συνάρτηση συνάρτησης() (
$a = 70 ;
ηχώ "

$a

" ;
}
λειτουργία();
ηχώ "

$a

" ;
?>

Το σενάριο θα εκτυπώσει πρώτα 70 και μετά 100:

70
100

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

$a = 1 ;
$b = 2 ;

Συνάρτηση Άθροισμα()
{
καθολική $a, $b;

$b = $a + $b ;
}

Αθροισμα();
echo $b ;
?>

Το παραπάνω σενάριο θα βγει " 3 Μετά τον καθορισμό $aΚαι μέσα στη συνάρτηση όπως παγκόσμιαΌλες οι αναφορές σε οποιαδήποτε από αυτές τις μεταβλητές θα παραπέμπουν στην καθολική τους έκδοση. Δεν υπάρχει όριο στον αριθμό των καθολικών μεταβλητών που μπορούν να χειριστούν οι συναρτήσεις που καθορίζονται από το χρήστη.

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

Χρήση $GLOBALS αντί για καθολική:

$a = 1 ;
$b = 2 ;

Συνάρτηση Άθροισμα()
{
$GLOBALS [ "b" ] = $GLOBALS [ "a" ] + $GLOBALS [ "b" ];
}

Αθροισμα();
echo $b ;
?>

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

συνάρτηση test_global()
{
// Οι περισσότερες προκαθορισμένες μεταβλητές δεν είναι
// "super" και να είναι διαθέσιμο στην τοπική περιοχή
// Η ορατότητα της συνάρτησης απαιτεί τον καθορισμό του "καθολικού".
παγκόσμια $HTTP_POST_VARS ;

Echo $HTTP_POST_VARS["όνομα"];

// Τα Superglobal είναι διαθέσιμα σε οποιοδήποτε εύρος
// ορατότητα και δεν απαιτούν τον καθορισμό "παγκόσμιας".
// Superglobals διαθέσιμα από την PHP 4.1.0
echo $_POST ["όνομα" ];
}
?>