Παραδείγματα χρήσης χώρου ονομάτων σε php. Χώροι ονομάτων στην PHP, εξηγούνται. Χώροι ονομάτων: Πολλαπλά πεδία περιγραφής

Πρόσφατα ενσωμάτωσα το έργο μου σε έναν χώρο ονομάτων και αντιμετώπισα το πρόβλημα της έλλειψης κατάλληλης τεκμηρίωσης. Όλα όσα καταφέραμε να βρούμε χρονολογούνται περίπου από το 2009 και είναι σχεδόν το 2012... Στο υλικό που βρέθηκε, υπάρχουν πολλά μέρη που δεν λειτουργούν που χρησιμοποιούν κάτι που δεν υπάρχει στην τρέχουσα έκδοση της php. Από αυτή την άποψη, θα ήθελα να ρίξω λίγο φως σε αυτό το θέμα.
Λοιπόν, τι είναι ένας χώρος ονομάτων ή χώρος ονομάτων; Η μεγάλη wikipedia τα ορίζει ως εξής:

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

Ολα ΕΝΤΑΞΕΙ? Στην πραγματικότητα είναι απλό. Πριν από την έκδοση 5.3, υπήρχαν μόνο δύο κενά στην php - global (στην οποία εκτελούνταν ο κύριος κώδικάς σας) και local (στο οποίο ορίστηκαν οι μεταβλητές συνάρτησης).

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


Ελπίζω να έγινε λίγο πιο ξεκάθαρο.

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

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

Προσοχή:για κάποιο λόγο η php δεν επιτρέπει τη χρήση της λέξης-κλειδιού χρήσησε μπλοκ και βρόχους κατάστασης

Ας πάρουμε το παράδειγμα από τις εικόνες και ας το εφαρμόσουμε σε κώδικα:

Προσοχή:η λέξη-κλειδί χώρου ονομάτων πρέπει να βρίσκεται στην αρχή του αρχείου, αμέσως μετά
αρχείο A.php
Αρχείο B.php
Μια εναλλακτική σύνταξη είναι δυνατή:
Συνιστάται να δηλώσετε κάθε χώρο ονομάτων σε ξεχωριστό αρχείο. Αν και είναι δυνατό σε ένα, δεν συνιστάται αυστηρά!
Τώρα ας περάσουμε στο τρίτο αρχείο, στο οποίο θα λειτουργεί το βασικό μας σενάριο
index.php
Φαίνεται ότι αυτό είναι ένα πλεονέκτημα, προστίθεται μόνο περισσότερος κώδικας, αλλά αυτό δεν είναι απολύτως αληθές, λίγο παρακάτω θα δώσω ένα παράδειγμα μιας κλάσης αυτόματης φόρτωσης, με την οποία οι γραμμές που συνδέουν αρχεία με κλάσεις θα είναι περιττές.
Τώρα ας δούμε τις τάξεις μας.

Προσοχή:χρησιμοποιώντας τον τελεστή ανάλυσης πεδίου (::) σε χώρους ονομάτων php δεν επιτρέπεται! Το μόνο πράγμα για το οποίο είναι κατάλληλο είναι η πρόσβαση σε μεθόδους και σταθερές στατικής κλάσης. Στην αρχή ήθελαν να το χρησιμοποιήσουν για τον χώρο ονομάτων, αλλά στη συνέχεια αποφάσισαν να μην το κάνουν λόγω προβλημάτων που προέκυψαν. Επομένως, μια κατασκευή όπως η A::A::say(); δεν είναι έγκυρο και θα οδηγήσει σε σφάλμα.

Για χώρους ονομάτων πρέπει να χρησιμοποιήσετε τον χαρακτήρα ανάστροφης κάθετο "\"
Προσοχή:Για να αποφευχθούν παρεξηγήσεις, είναι απαραίτητο να αποφύγετε αυτόν τον χαρακτήρα όταν χρησιμοποιείται σε συμβολοσειρές: "\\"

Οι χώροι ονομάτων μπορούν να είναι ένθετοι ο ένας μέσα στον άλλο, ας προσθέσουμε στο αρχείο μας A.php:
και στο ευρετήριο θα γράψουμε τα εξής:

Ένα σημαντικό σημείο είναι να χρησιμοποιείτε ψευδώνυμα για εισαγόμενους χώρους. Θα μπορούσατε να γράψετε A\subA::say(); Θα συμφωνήσετε ότι είναι δύσκολο να γράφετε πλήρεις διαδρομές σε διαστήματα κάθε φορά· για να αποφευχθεί αυτό, εισήχθησαν ψευδώνυμα. Κατά τη μεταγλώττιση, θα συμβεί το εξής: αντί για το ψευδώνυμο sub, θα αντικατασταθεί το A\subA, οπότε θα λάβουμε την κλήση A\subA::say();

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

Προκειμένου να αποφευχθούν προβλήματα με την αυτόματη φόρτωση κλάσεων από χώρους, το σύστημα αρχείων πρέπει να οργανωθεί παρόμοια με την οργάνωση των χώρων. Για παράδειγμα, έχουμε τάξεις ριζικού φακέλου, όπου θα αποθηκεύονται οι τάξεις μας και, στη συνέχεια, οι χώροι μας μπορούν να οργανωθούν ως εξής
classes\A\A.php
classes\A\sub\A.php (ο υποχώρος θα τοποθετηθεί σε ξεχωριστό αρχείο)
classes\B\B.php

Η PHP έχει μια μαγική σταθερά __NAMESPACE__ που περιέχει το όνομα του τρέχοντος χώρου.

Και τώρα για την αυτόματη φόρτωση.

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

" .$file ."σε " .$filepath)); if (file_exists($filepath)) (if(Autoloader::debug) Autoloader::StPutFile(("συνδεδεμένο " .$filepath)); $flag = FALSE; require_once($filepath); break; ) Autoloader::recursive_autoload($file, $path2, &$flag); ) ) closeir($handle); ) ) ιδιωτική στατική συνάρτηση StPutFile($data) ( $dir = $_SERVER["DOCUMENT_ROOT"] ." /Log/Log.html"; $file = fopen($dir, "a"); flock($file, LOCK_EX); fwrite($file, ("║" .$data ."=>" .date(" d.m.Y H:i:s") ."

" .PHP_EOL)); flock($file, LOCK_UN); fclose ($file); ) ) \spl_autoload_register("yourNameSpace\Autoloader::autoload"); )
Αν κοιτάξετε τα ονόματα των κλάσεων που εισάγονται για φόρτωση, θα δείτε ότι πριν από κάθε κλάση υπάρχει ένα πρόθεμα από τον χώρο ονομάτων που καθορίζεται σε χρήση. Αυτός είναι ο λόγος για τον οποίο προτείνω τη χρήση της θέσης των αρχείων σε καταλόγους παρόμοιους με τον χώρο ονομάτων· αυτό επιταχύνει την αναζήτηση σε μία ή δύο επαναλήψεις.

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

Για να δείξουμε μερικές από τις δυναμικές δυνατότητες της γλώσσας με κενά, ας δηλώσουμε μια άλλη κλάση:
test.php

Ευρετήριο.php
sayName("δοκιμή"); //ή μπορείτε να κάνετε αυτό το test\sayName("test2"); //ή σαν αυτό $obj::sayName("test"); //ή μπορείτε να κάνετε αυτό το τεστ::sayName("test2");

Ελπίζω ότι το άρθρο μου θα είναι χρήσιμο σε κάποιον.

Η PHP, ξεκινώντας με την έκδοση 5.3, μας έδωσε χώρους ονομάτων. Από τότε, έχει γίνει κάποια υποτονική και κάποια έντονη συζήτηση σχετικά με το πώς να χρησιμοποιήσετε αυτόν τον χώρο ονομάτων;
Ορισμένα πλαίσια, όπως το Symphony, το Laravel και, φυσικά, το Zend, έχουν υιοθετήσει αυτήν την τεχνολογία.
Όλα αυτά ταιριάζουν λίγο πολύ στο σχήμα MVC. Παραμένει μία, πιθανώς αιώνια, συζήτηση: ποιο πρέπει να είναι το κύριο ζευγάρι γάμου της εφαρμογής - Μοντέλο και Ελεγκτής;
Κάποιοι μας λένε ότι το Μοντέλο πρέπει να είναι εύσωμο και χοντρό και μαζί της ένα λεπτό και αδύνατο Controller. Με μια λέξη - μητριαρχία.
Άλλοι, αντίθετα, πιστεύουν ότι ο Ελεγκτής πρέπει να διαχειρίζεται και να διοικεί τα πάντα, άρα αποδεικνύεται συμπαγής και καλοφαγωμένος. Και μαζί του είναι ένα αδύνατο, αδύνατο Μοντέλο, του οποίου η δουλειά συνοψίζεται να δίνει και να φέρει. Αυτό είναι πατριαρχία.
Τι είναι λοιπόν καλύτερο στο σχήμα MVC; Πατριαρχία ή μητριαρχία;
Ας το δούμε αυτό από τη σκοπιά της οικοδόμησης μιας οικογενειακής μονάδας βασισμένης στη δημοκρατία. Και αφήστε το Namespace να μας βοηθήσει σε αυτό.

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

Αρχικά, ας δημιουργήσουμε τον σκελετό της εφαρμογής. Όσο μπανάλ κι αν είναι, ας είναι blog.

Έχουμε δημιουργήσει μια βασική δομή όπου:

  • Το ιστολόγιο είναι ο χώρος αποθήκευσης της εφαρμογής μας.
  • Προβολές και πρότυπα - αποθήκευση προβολών και προτύπων.
  • Βοηθητικό πρόγραμμα - αποθετήριο κοινόχρηστων βιβλιοθηκών.
  • index.php - script bootstrap;
  • Post - εδώ πρέπει να λάβει χώρα το οικογενειακό ειδύλλιο του Controller και του Model.

Με το index.php όλα είναι απλά:

τρέξιμο(); /* * τέλος του index.php */

Καθορίζουμε τις απαραίτητες διαδρομές και δημιουργούμε έναν αυτόματο φορτωτή.
Το πρόγραμμα αυτόματης φόρτωσης φορτώνει τις απαιτούμενες κλάσεις, οι οποίες βρίσκονται σε μια ιεραρχία φακέλου σύμφωνα με τον χώρο ονομάτων της κλάσης. Για παράδειγμα, η κλάση BlogPostServicesView θα αναζητηθεί στο Blog/Post/Services.
Και εδώ είναι η πρώτη συνάντηση με το Namespace.
Όταν ξεκινάμε το index.php, δημιουργούμε ένα στιγμιότυπο της εφαρμογής Blog, η κλάση της οποίας φορτώνεται από το Blog/Blog.php.
Ας τον δούμε.

post = new Post(); ) δημόσια συνάρτηση run() ( $this->post->view->all(); ) )//end class Blog

Κατά τη δημιουργία της κλάσης Blog, εισάγουμε μια κλάση Post σε αυτήν με το Namespace BlogPost και το πρόγραμμα αυτόματης φόρτωσης τη φορτώνει από το Blog/Post/Post.php.
Πιθανώς αυτή η κλάση μπορεί να ονομαστεί Controller,

view = new View(); ) )//τελική τάξη Δημοσίευση

Η οντότητα Ταχυδρομείου περιλαμβάνει:
- τη δομή της ίδιας της εγγραφής δεδομένων - BlogPostEntitiesPostEntity.php

Υπηρεσίες που εξυπηρετούν αιτήματα ελεγκτή - BlogPostServicesView.php (μια από τις υπηρεσίες, για παράδειγμα)

db = new DB(); )//end __κατασκευή δημόσια συνάρτηση all() ( $posts = $this->db->survey(); Contemplate::compose(array("header" => "header", "main" => "main", "footer" => "footer",), array("posts" => $posts, "title" => "Viper site",)); ) )//end class PostView

Το σύστημα αλληλεπίδρασης της βάσης δεδομένων - BlogPostRepositoriesDB.php - εδώ είναι, το λεπτό, κομψό μας μοντέλο,
Απλώς δώστε το, φέρτε το και τίποτα περισσότερο!

dbh = new PDO("mysql:host=localhost;dbname=test", $user, $pass, array(PDO::ATTR_PERSISTENT => true)); ) catch (PDOException $e) ( echo "Error!: " . $e->getMessage() ."
"; die(); ) )//end __construct public function research() ( $query_view = $this->dbh->prepare("SELECT * from posts"); $query_view->execute(); return $query_view- >fetchAll(PDO::FETCH_CLASS, "BlogPostEntitiesPostEntity"); )//τελική έρευνα )//τελική κατηγορία Db

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

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

Το άρθρο εμπνεύστηκε από σκέψεις σχετικά με αυτό το θέμα από τον Taylor Otwell, τον συγγραφέα του πλαισίου Laravel, για το οποίο τον ευχαριστούμε πολύ.
Διεύθυνση του παραδείγματος πηγαίου κώδικα στο GitHub.

Γειά σου. Στο σημερινό άρθρο θα δούμε, τι είναι οι χώροι ονομάτων στην PHP.

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

Χώρος ονομάτων- αυτό είναι κάποιο είδος αποθήκευσης που δημιουργήθηκε για την αφηρημένη ομαδοποίηση μοναδικών αναγνωριστικών (ονόματα).

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

Ας δημιουργήσουμε ένα αρχείο myclass.phpμε αυτό το περιεχόμενο

Χώρος ονομάτων my\oneProject;
τάξη MyClass ( )
?>

Εδώ έχουμε δημιουργήσει μια κλάση στον χώρο ονομάτων my\oneProject. Παρεμπιπτόντως, πρέπει να γράψετε ακριβώς την ανάστροφη κάθετο. Μην μπερδεύεστε!

Τώρα στο αρχείο index.phpας γράψουμε το εξής

require_once("myclass.php");
$mc = new MyClass(); // Σφάλμα: η κλάση δεν βρέθηκε
$mc = νέο my\oneProject\MyClass(); // όλα λειτουργούν
?>

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

Μπορούμε να καθορίσουμε πολλά ταυτόχρονα χώρους ονομάτωνσε ένα αρχείο

namespace Project;

Const CONNECT_OK = 1;
Σύνδεση κλάσης ( )
συνάρτηση σύνδεση () ( )

NamespaceAnotherProject;

Const CONNECT_OK = 1;
Σύνδεση κλάσης ( )
συνάρτηση σύνδεση () ( )
?>

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

Μπορούμε επίσης να χρησιμοποιήσουμε σύνταξη παρένθεσης.

Έργο χώρου ονομάτων (

Const CONNECT_OK = 1;
Σύνδεση κλάσης ( )
συνάρτηση σύνδεση () ( )
}

Χώρος ονομάτων AnotherProject (

Const CONNECT_OK = 1;
Σύνδεση κλάσης ( )
συνάρτηση σύνδεση () ( )
}
?>

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

Έργο χώρου ονομάτων (

Const CONNECT_OK = 1;
Σύνδεση κλάσης ( )
συνάρτηση σύνδεση () ( )
}

Χώρος ονομάτων ( // καθολικός κώδικας
session_start();
$a = Project\connect();
echo Project\Connection::start();
}
?>

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

Για να μάθετε σε ποιον χώρο ονομάτων βρίσκεστε αυτήν τη στιγμή, μπορείτε να χρησιμοποιήσετε τη σταθερά __NAMESPACE__

namespace Project;
ηχώ """, __NAMESPACE__, """; // θα εκτυπώσει το "Project"
?>

Χρησιμοποιώντας αυτή τη σταθερά μπορείτε, για παράδειγμα, να δημιουργήσετε δυναμικά ονόματα

namespace Project;

Συνάρτηση incl($classname) (
$a = __NAMESPACE__ . "\\" . $classname;
επιστροφή νέου $a;
}
?>

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

Πρόσφατα ενσωμάτωσα το έργο μου σε έναν χώρο ονομάτων και αντιμετώπισα το πρόβλημα της έλλειψης κατάλληλης τεκμηρίωσης. Όλα όσα καταφέραμε να βρούμε χρονολογούνται περίπου από το 2009 και είναι σχεδόν το 2012... Στο υλικό που βρέθηκε, υπάρχουν πολλά μέρη που δεν λειτουργούν που χρησιμοποιούν κάτι που δεν υπάρχει στην τρέχουσα έκδοση της php. Από αυτή την άποψη, θα ήθελα να ρίξω λίγο φως σε αυτό το θέμα.
Λοιπόν, τι είναι ένας χώρος ονομάτων ή χώρος ονομάτων; Η μεγάλη wikipedia τα ορίζει ως εξής:

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

Ολα ΕΝΤΑΞΕΙ? Στην πραγματικότητα είναι απλό. Πριν από την έκδοση 5.3, υπήρχαν μόνο δύο κενά στην php - global (στην οποία εκτελούνταν ο κύριος κώδικάς σας) και local (στο οποίο ορίστηκαν οι μεταβλητές συνάρτησης).

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


Ελπίζω να έγινε λίγο πιο ξεκάθαρο.

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

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

Προσοχή:για κάποιο λόγο η php δεν επιτρέπει τη χρήση της λέξης-κλειδιού χρήσησε μπλοκ και βρόχους κατάστασης

Ας πάρουμε το παράδειγμα από τις εικόνες και ας το εφαρμόσουμε σε κώδικα:

Προσοχή:η λέξη-κλειδί χώρου ονομάτων πρέπει να βρίσκεται στην αρχή του αρχείου, αμέσως μετά
αρχείο A.php
Αρχείο B.php
Μια εναλλακτική σύνταξη είναι δυνατή:
Συνιστάται να δηλώσετε κάθε χώρο ονομάτων σε ξεχωριστό αρχείο. Αν και είναι δυνατό σε ένα, δεν συνιστάται αυστηρά!
Τώρα ας περάσουμε στο τρίτο αρχείο, στο οποίο θα λειτουργεί το βασικό μας σενάριο
index.php
Φαίνεται ότι αυτό είναι ένα πλεονέκτημα, προστίθεται μόνο περισσότερος κώδικας, αλλά αυτό δεν είναι απολύτως αληθές, λίγο παρακάτω θα δώσω ένα παράδειγμα μιας κλάσης αυτόματης φόρτωσης, με την οποία οι γραμμές που συνδέουν αρχεία με κλάσεις θα είναι περιττές.
Τώρα ας δούμε τις τάξεις μας.

Προσοχή:χρησιμοποιώντας τον τελεστή ανάλυσης πεδίου (::) σε χώρους ονομάτων php δεν επιτρέπεται! Το μόνο πράγμα για το οποίο είναι κατάλληλο είναι η πρόσβαση σε μεθόδους και σταθερές στατικής κλάσης. Στην αρχή ήθελαν να το χρησιμοποιήσουν για τον χώρο ονομάτων, αλλά στη συνέχεια αποφάσισαν να μην το κάνουν λόγω προβλημάτων που προέκυψαν. Επομένως, μια κατασκευή όπως η A::A::say(); δεν είναι έγκυρο και θα οδηγήσει σε σφάλμα.

Για χώρους ονομάτων πρέπει να χρησιμοποιήσετε τον χαρακτήρα ανάστροφης κάθετο "\"
Προσοχή:Για να αποφευχθούν παρεξηγήσεις, είναι απαραίτητο να αποφύγετε αυτόν τον χαρακτήρα όταν χρησιμοποιείται σε συμβολοσειρές: "\\"

Οι χώροι ονομάτων μπορούν να είναι ένθετοι ο ένας μέσα στον άλλο, ας προσθέσουμε στο αρχείο μας A.php:
και στο ευρετήριο θα γράψουμε τα εξής:

Ένα σημαντικό σημείο είναι να χρησιμοποιείτε ψευδώνυμα για εισαγόμενους χώρους. Θα μπορούσατε να γράψετε A\subA::say(); Θα συμφωνήσετε ότι είναι δύσκολο να γράφετε πλήρεις διαδρομές σε διαστήματα κάθε φορά· για να αποφευχθεί αυτό, εισήχθησαν ψευδώνυμα. Κατά τη μεταγλώττιση, θα συμβεί το εξής: αντί για το ψευδώνυμο sub, θα αντικατασταθεί το A\subA, οπότε θα λάβουμε την κλήση A\subA::say();

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

Προκειμένου να αποφευχθούν προβλήματα με την αυτόματη φόρτωση κλάσεων από χώρους, το σύστημα αρχείων πρέπει να οργανωθεί παρόμοια με την οργάνωση των χώρων. Για παράδειγμα, έχουμε τάξεις ριζικού φακέλου, όπου θα αποθηκεύονται οι τάξεις μας και, στη συνέχεια, οι χώροι μας μπορούν να οργανωθούν ως εξής
classes\A\A.php
classes\A\sub\A.php (ο υποχώρος θα τοποθετηθεί σε ξεχωριστό αρχείο)
classes\B\B.php

Η PHP έχει μια μαγική σταθερά __NAMESPACE__ που περιέχει το όνομα του τρέχοντος χώρου.

Και τώρα για την αυτόματη φόρτωση.

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

" .$file ."σε " .$filepath)); if (file_exists($filepath)) (if(Autoloader::debug) Autoloader::StPutFile(("συνδεδεμένο " .$filepath)); $flag = FALSE; require_once($filepath); break; ) Autoloader::recursive_autoload($file, $path2, &$flag); ) ) closeir($handle); ) ) ιδιωτική στατική συνάρτηση StPutFile($data) ( $dir = $_SERVER["DOCUMENT_ROOT"] ." /Log/Log.html"; $file = fopen($dir, "a"); flock($file, LOCK_EX); fwrite($file, ("║" .$data ."=>" .date(" d.m.Y H:i:s") ."

" .PHP_EOL)); flock($file, LOCK_UN); fclose ($file); ) ) \spl_autoload_register("yourNameSpace\Autoloader::autoload"); )
Αν κοιτάξετε τα ονόματα των κλάσεων που εισάγονται για φόρτωση, θα δείτε ότι πριν από κάθε κλάση υπάρχει ένα πρόθεμα από τον χώρο ονομάτων που καθορίζεται σε χρήση. Αυτός είναι ο λόγος για τον οποίο προτείνω τη χρήση της θέσης των αρχείων σε καταλόγους παρόμοιους με τον χώρο ονομάτων· αυτό επιταχύνει την αναζήτηση σε μία ή δύο επαναλήψεις.

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

Για να δείξουμε μερικές από τις δυναμικές δυνατότητες της γλώσσας με κενά, ας δηλώσουμε μια άλλη κλάση:
test.php

Ευρετήριο.php
sayName("δοκιμή"); //ή μπορείτε να κάνετε αυτό το test\sayName("test2"); //ή σαν αυτό $obj::sayName("test"); //ή μπορείτε να κάνετε αυτό το τεστ::sayName("test2");

Ελπίζω ότι το άρθρο μου θα είναι χρήσιμο σε κάποιον.

(PHP 5 >= 5.3.0, PHP 7)

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

  1. Σχετικό όνομα αρχείου όπως foo.txt. Αυτό επιλύει να τρέχον κατάλογο/foo.txtόπου τρέχον κατάλογος είναι ο κατάλογος που είναι κατειλημμένος αυτήν τη στιγμή. Έτσι, εάν ο τρέχων κατάλογος είναι /home/foo, το όνομα αποφασίζει να /home/foo/foo.txt.
  2. Σχετικό όνομα διαδρομής όπως υποκατάλογος/foo.txt. Αυτό επιλύει να τρέχον κατάλογος/υποκατάλογος/foo.txt.
  3. Απόλυτο όνομα διαδρομής όπως /main/foo.txt. Αυτό επιλύει να /main/foo.txt.
Η ίδια αρχή μπορεί να εφαρμοστεί σε στοιχεία με χώρο ονομάτων στην PHP. Για παράδειγμα, ένα όνομα κλάσης μπορεί να αναφέρεται με τρεις τρόπους:
  1. Μη αναγνωρισμένο όνομα ή ένα όνομα κλάσης χωρίς πρόθεμα όπως $a = new foo();ή foo::staticmethod(); τρέχον χώρο ονομάτων, αυτό επιλύει να currentnamespace\foo foo. Μια προειδοποίηση: τα ονόματα που δεν πληρούν τις προϋποθέσεις για συναρτήσεις και σταθερές θα επιλυθούν σε καθολικές συναρτήσεις και σταθερές εάν δεν οριστεί η συνάρτηση ή η σταθερά με χώρο ονομάτων. Για λεπτομέρειες, ανατρέξτε στην ενότητα Χρήση χώρων ονομάτων: εναλλακτική σε καθολική συνάρτηση/σταθερά.
  2. Πιστοποιημένο όνομα ή ένα όνομα κλάσης με πρόθεμα όπως $a = νέο subnamespace\foo();ή subnamespace\foo::staticmethod();. Εάν ο τρέχων χώρος ονομάτων είναι τρέχον χώρο ονομάτων, αυτό επιλύει να currentnamespace\subnamespace\foo. Εάν ο κώδικας είναι καθολικός, κώδικας χωρίς διάστημα ονομάτων, αυτό επιλύεται σε subnamespace\foo.
  3. Πλήρως αναγνωρισμένο όνομα ή ένα όνομα με πρόθεμα με τελεστή καθολικού προθέματος όπως $a = new \currentnamespace\foo();ή \currentnamespace\foo::staticmethod();. Αυτό επιλύεται πάντα στο κυριολεκτικό όνομα που καθορίζεται στον κώδικα, currentnamespace\foo.

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

namespace Foo\Bar\subnamespace;

const FOO = 1 ;
function foo()()
τάξη foo
{
}
?>

Χώρος ονομάτων Foo\Bar;
περιλαμβάνει "file1.php" ;

const FOO = 2;
function foo()()
τάξη foo
{
στατική συνάρτηση staticmethod()()
}

/* Όνομα χωρίς επιφύλαξη */
foo(); foo::staticmethod(); echo FOO ;

/* Πιστοποιημένο όνομα */
subnamespace\foo(); // επιλύει τη λειτουργία Foo\Bar\subnamespace\foo
subnamespace\foo::staticmethod(); // επιλύει στην κλάση Foo\Bar\subnamespace\foo,
// μέθοδος staticmethod
echo subnamespace\FOO; // επιστρέφει σε σταθερό Foo\Bar\subnamespace\FOO

/* Πλήρως πιστοποιημένο όνομα */
\foo\bar\foo(); // επιλύει τη λειτουργία Foo\Bar\foo
\foo\bar\foo::staticmethod(); // επιλύει στην κλάση Foo\Bar\foo, μέθοδος staticmethod
echo\Foo\Bar\FOO; // επιστρέφει σε σταθερή Foo\Bar\FOO
?>

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