Esempi di utilizzo dello spazio dei nomi in php. Spazi dei nomi in PHP, spiegato. Spazio dei nomi globale


  • Traduzione
  • Esercitazione
Nota per.: sono a conoscenza che al momento della traduzione la versione attuale di PHP è la 5.5, ed anche che esiste un saggio manuale. Ma ho trovato interessante il modo in cui l'autore presenta la funzionalità del namespace. Forse l'articolo aiuterà alcuni di coloro che stanno appena imparando le basi (e non solo altri, ci sono molti sviluppatori barbuti che hanno optato per PHP 5.2). Hodor.

In PHP, a partire dalla versione 5.3, sono comparsi i namespace. La maggior parte dei linguaggi moderni dispone di questa funzionalità da tempo, ma PHP è arrivato un po’ in ritardo. Tuttavia, ogni nuova funzionalità ha il suo scopo, scopriamo come possiamo trarre vantaggio dall'utilizzo del namespace.

In PHP non è possibile avere due classi con lo stesso nome, devono essere tutte uniche. Il problema con questa limitazione è che se utilizzi la libreria di terze parti di qualcun altro che fornisce una classe chiamata User , non puoi creare la tua classe denominata anch'essa User . Questo è davvero negativo, perché Utente è un nome molto conveniente per una classe, non è vero?

I namespace ci consentono di aggirare questo problema e possiamo creare tutte le classi User di cui abbiamo bisogno. I namespace ci consentono anche di organizzare il nostro codice in pacchetti convenienti, oltre a indicare la nostra proprietà di quel codice.

Diamo un'occhiata a una classe molto comune. Sì... so che li hai già utilizzati, cosa c'entrano i namespace? Fidati di me su questo, ok?

Spazio dei nomi globale

Ecco una lezione molto semplice:
Niente di speciale come puoi vedere, e se vuoi usarlo, fai così:
Dale, conosco PHP...

Ok, ok, scusa. Il punto è che possiamo pensare a questa classe come se fosse nello spazio dei nomi globale. Non sono del tutto sicuro che sia il termine giusto, ma mi sembra abbastanza appropriato. In realtà, ciò significa che la classe non appartiene a nessun pacchetto, ma solo a una classe ordinaria.

Facile utilizzo degli spazi dei nomi

Creiamo un altro Eddard, accanto a quello globale.
Qui abbiamo una classe molto simile con una piccola modifica, l'aggiunta di una direttiva sullo spazio dei nomi. Spazio dei nomi stringa Stark; dice a PHP che stiamo lavorando nello spazio dei nomi Stark e qualsiasi codice (dichiarazione di classi, funzioni, variabili, ecc.) farà riferimento ad esso.

Quindi, dobbiamo creare un nuovo Edd, se decidi che deve essere fatto in questo modo:
Quindi no, non è vero. Qui otteniamo un'istanza della classe dal primo esempio creato in precedenza. Non quello nello spazio dei nomi Stark. Proviamo a creare un'istanza di Eddard Stark.
Per creare un'istanza di una classe, dobbiamo anteporre al nome della classe un prefisso preso dallo spazio dei nomi a cui appartiene la classe e utilizzare come delimitatore barra rovesciata. Di conseguenza, abbiamo un'istanza esattamente della classe di cui abbiamo bisogno. Non è magico?

A proposito, gli spazi dei nomi possono formare una gerarchia arbitrariamente complessa, utilizzando tutti i livelli necessari. Per esempio:
This\Namespace\And\Class\Combination\Is\Silly\But\Works

Teoria della relatività

Ricorda come ti ho detto che PHP funziona sempre in relazione allo spazio dei nomi corrente. Diamo un'occhiata a questo in azione:
Aggiungendo una direttiva namespace, facciamo sapere a PHP che ci troviamo nel namespace Stark. Poiché è in essa che abbiamo definito la classe Eddard, questo è esattamente ciò che otterremo. Vedi, tutto è relativo.

Ora che abbiamo cambiato lo spazio dei nomi, abbiamo un piccolo problema. Hai idea di cosa sto parlando? Ora come otteniamo la nostra classe Eddard originale? Ebbene, quello nello spazio globale?

Fortunatamente, PHP ha un trucco che ci permette di risolvere questo problema, semplicemente aggiungendo \ al nome della classe.
Vedendo la barra iniziale, PHP capisce che dobbiamo guardare oltre lo spazio dei nomi corrente e crea un'istanza della classe di cui abbiamo bisogno.

Ora usa la tua immaginazione. Immagina di avere una classe da uno spazio dei nomi diverso chiamato Tully\Edmure. Ora dobbiamo usarlo nello spazio Stark. E come lo facciamo?

Ancora una volta, abbiamo dovuto utilizzare una barra rovesciata per diventare globali prima di istanziare la classe nello spazio Tully.

In generale, fare riferimento a classi di altri spazi dei nomi come questo, utilizzando la gerarchia completa nel nome, può essere piuttosto noioso. Ma fortunatamente c'è un'opzione per creare una scorciatoia, diamo un'occhiata:

Usando la direttiva use, possiamo ottenere una classe da uno spazio dei nomi diverso. Per favore, non chiedermi "perché non abbiamo messo una barra iniziale qui?" perché semplicemente non lo so. Per quanto ne so, questa è l'unica eccezione. No, puoi usare una barra qui. ma non ci sarà alcun significato in questo.

Oh, ancora un piccolo trucchetto! Possiamo dare dei soprannomi alle nostre classi importate:
Usando la parola chiave as, abbiamo dato alla classe Tully/Brynden il soprannome Blackfish, che ci permette di usare il nuovo soprannome per identificarla nel namespace corrente. Intelligente, non è vero? Ciò è anche molto comodo se è necessario utilizzare due classi con lo stesso nome all'interno dello stesso spazio dei nomi:

Dando ai Daenerys dello spazio Dothraki il soprannome di Khaleesi, possiamo usare entrambe le classi di Daenerys. Abbastanza conveniente, lì possiamo utilizzare tutte le classi necessarie nella nostra applicazione.

Struttura

Gli spazi dei nomi possono anche aiutarci a organizzare il nostro codice. Lasciami dimostrare.

Diciamo che voglio creare una libreria open source. Mi piacerebbe se altri potessero usare il mio codice, sarebbe fantastico! Il problema è che i nomi delle classi nel mio codice erano in conflitto con l'applicazione della mia libreria da parte dell'utente. Sarebbe terribilmente scomodo. Ecco come risolverei questo problema:
Dayle\Blog\Contenuto\Post Dayle\Blog\Contenuto\Pagina Dayle\Blog\Tag
Qui ho usato il mio nome per dimostrare che il codice mi appartiene e per separare il mio codice dal codice utente della mia biblioteca. All'interno dello spazio dei nomi di base ho creato una struttura di classi in base alla loro gerarchia.

Una volta che inizi a utilizzare Composer, imparerai come utilizzare gli spazi dei nomi per semplificare il caricamento automatico del codice. Consiglio vivamente di dare un'occhiata a questo utile meccanismo.

Screpolatura

A dire il vero mi sento un po' in colpa per aver chiamato questo sottotitolo "Svantaggi". Ciò di cui sto per parlare in realtà non è un errore.

Il fatto è che in altre lingue la funzionalità degli spazi dei nomi è implementata in modo simile e allo stesso tempo le lingue forniscono funzionalità aggiuntive per interagire con gli spazi dei nomi.

In Java, ad esempio, puoi importare più classi nello spazio dei nomi corrente utilizzando l'istruzione import. In Java, import è analogo a use e utilizza punti per separare spazi dei nomi (o pacchetti) nidificati. Ecco un esempio:
importa dayle.blog.*;
Questo importerà tutte le classi nel pacchetto "dayle.blog".

Non puoi farlo in PHP. È necessario importare ciascuna classe separatamente. Scusa. In realtà, perché mi sto scusando? Vai avanti e lamentati con il team di sviluppo PHP, ma ti chiedo di essere educato. Hanno fatto un sacco di cose interessanti ultimamente.

Ecco un trucchetto per alleviare un po' il problema. Immagina di avere la struttura della classe dell'esempio precedente. Possiamo prendere parte del sottospazio e dargli un alias.
Ciò può essere utile quando si utilizza un numero elevato di classi. Buono a tutti!

Accetterò volentieri tutti i desideri e suggerimenti in un messaggio personale, grazie.

Una variabile definisce un valore, ma può essere un riferimento a un'altra variabile e avere il suo valore. Durante l'esecuzione di un algoritmo, una variabile assume solitamente molti valori diversi. Una costante memorizza un solo valore. Un oggetto è imprevedibile: tende ad avere struttura, contenuto e molte caratteristiche.

Uno spazio dei nomi è una raccolta di variabili, costanti, oggetti, funzioni e altri costrutti creati dallo sviluppatore a cui è possibile fare riferimento tramite il nome di questo spazio dei nomi.

Nomi: la sfera della descrizione dei dati e degli algoritmi

I nomi degli elementi (variabili, costanti, oggetti, funzioni e altri costrutti dello sviluppatore) non si intersecano mai. PHP interpreta qualsiasi corrispondenza di nome come un errore grave e, nei casi in cui non riesce a identificare chiaramente il problema, lo sviluppatore riceve un codice che non funziona come previsto o una casella bianca nel browser.

Tutti i nomi di tutti i dati devono essere univoci perché lo spazio è globale. Anche i nomi di oggetti e funzioni non dovrebbero essere ripetuti, ma l'ambito della visibilità globale viene interrotto nei corpi dei metodi di oggetti e funzioni. Ha il proprio spazio dei nomi locale e nulla ti impedisce di nominare qualcosa internamente nello stesso modo in cui viene designato esternamente.

L’esempio sopra è un classico, se non presti attenzione alla parola chiave namespace: tutto è come sempre. I secondi comprendono opere. Il prefisso NameSpaceTwo\ prima dei nomi delle funzioni specifica da quale inserto viene preso il codice.

Se rimuoviamo la parola chiave globale e l'operazione dalla prima funzione $iExt = 1; spostati alla riga sopra, né la prima né la seconda funzione conosceranno il valore della variabile 100.

Spazi dei nomi: ambiti di descrizione multipli

L'esempio mostrato ha un file condiviso che utilizza due inserimenti. Ogni inserto ha la stessa funzione scCheckName(). Quale scegliere viene deciso dal programmatore utilizzando il nome dello spazio rilevante al momento giusto nel posto giusto nel codice.

Il fatto che nel codice comune sia presente lo stesso nome (dopo l'unione degli inserti) non provoca errore per il semplice motivo che ogni file di inserto è contrassegnato con il proprio nome univoco.

Nel primo file, tutto ciò che verrà descritto in esso è associato al nome NameSpaceOne. Nel secondo file tutte le descrizioni verranno associate al nome NameSpaceTwo.

È consentita qualsiasi duplicazione dei nomi in entrambi i file, ma in ciascuno di essi qualsiasi nome di elemento (variabile, costante, oggetto, funzione) deve essere univoco.

In questo esempio, la modifica del nome dello spazio dei nomi nella chiamata alla funzione scCheckName() ha impedito la modifica della variabile $iExt del secondo spazio dei nomi. Ecco perché nell'esempio la parola "cambiato" è evidenziata in modo particolare: il cambiamento in realtà non è avvenuto. Il valore della variabile rimane lo stesso.

Test e progettazione multipla

Questi semplici esempi dimostrano che è possibile semplificare facilmente lo sviluppo di progetti complessi, aumentare l’efficienza, la produttività e velocizzare il lavoro. Sicuramente sono apparse immediatamente le prime idee per l'utilizzo degli spazi dei nomi:

  • test sicuri degli script - sostituendo gli spazi “di lavoro” con analoghi di test;
  • progettazione sicura da parte di grandi team di sviluppatori, fornendo loro spazi “individuali” per descrivere gli elementi.

In effetti, lo spazio dei nomi è molto più importante. Il linguaggio PHP, lo spazio dei nomi e ogni elemento della descrizione (variabile, costante, oggetto...) forniscono da tempo allo sviluppatore la capacità di manipolare in modo indipendente la sintassi e la semantica.

Costrutti linguistici e regola generale della programmazione moderna: "compreso" - eseguito - c'è una contraddizione: uno "schermo bianco" non ha alcun effetto su uno sviluppatore professionista.

Molti programmatori non sanno nemmeno dove cercare un messaggio di errore PHP quando non c’è nulla nel browser (una casella bianca vuota). Ad un certo stadio del suo sviluppo, un programmatore pensa in sintassi e semantica PHP, “funziona” automaticamente e il risultato: la propria sintassi e la propria semantica, entro i limiti di ciò che è consentito.

Uno schermo bianco è una reazione immediata e inequivocabile da parte di un programmatore professionista e l'errore viene eliminato. Perché perdere tempo con un debugger e visualizzare il registro degli errori?

Oggetti, array e spazi dei nomi

Si potrebbe dire che le variabili, le costanti e le funzioni appartengono al passato, ma vengono utilizzate nella progettazione degli oggetti. Un buon codice è quando l'algoritmo è rappresentato da oggetti interagenti e non da una sequenza di costrutti corretti.

Se usi array di oggetti, manipoli l'idea di uno stack e dell'ultimo (primo) elemento dell'array, puoi ottenere dinamiche: gli oggetti stessi “decidono” come dovrebbe funzionare la funzionalità del sito a seconda della situazione attuale .

In PHP, uno spazio dei nomi è un tipo speciale di variabile, rappresentato da un nome univoco, spesso complesso. Il nome dello spazio dei nomi viene utilizzato nel codice. Se si tratta di una stringa, puoi sostituire uno spazio con un altro durante l'esecuzione dello script.

Se PHP utilizza i nomi degli spazi dei nomi come valori variabili, allora questa è una sintassi ancora più caricata semanticamente, persino più forte degli array di oggetti.

Un oggetto è una struttura e un contenuto caratterizzati dall'unità. Uno spazio dei nomi è un insieme di oggetti, elementi e relazioni tra loro.

Non è possibile condurre esperimenti su un sistema in esecuzione, ma grazie al namespace, PHP offre la possibilità di simulare un sistema in esecuzione reale in uno spazio diverso allo scopo di:

  • ulteriori sviluppi;
  • test;
  • manutenzione, ecc.

Se astraiamo dalla sintassi proposta dagli sviluppatori PHP e immaginiamo i namespace come sistemi complessi globali di oggetti, allora gli orizzonti delle possibilità si espandono molte volte.

Sintassi e utilizzo dello spazio dei nomi

PHP accetta solo la parola namespace nella prima riga di codice di ogni file. Tutte le descrizioni devono seguire solo questa. La sintassi include solo il nome indicato nel senso usuale del nome.

È importante usare le parole corrette che trasmettono il significato. È meglio quando il nome è lungo, ma contiene qualcosa che faccia capire chiaramente di che spazio stiamo parlando, cosa fa, cosa descrive, cosa accetta o per cosa è stato creato.

Gli spazi possono essere nidificati indefinitamente, ma non si dovrebbe abusarne. Il nome deve essere chiaro, l'annidamento deve essere giustificato e la sequenza dei nomi degli spazi deve avere una logica.

Nelle applicazioni in uso e nello spazio dei nomi, PHP consente una codifica complessa, ma quando possibile è meglio optare per l'opzione semplice.

La regola generale è: namespace è una descrizione e questo è un file, use importa lo spazio nello script use e gli assegna un alias (collegamento breve).

Un semplice esempio di classi (oggetti) a caricamento automatico

L'attività contiene un oggetto per la manipolazione di stringhe, stili di elementi di pagina (descrizioni CSS), un oggetto data, un oggetto file system e un oggetto database. Lo scopo dell'implementazione è creare semplici interfacce per queste cinque posizioni in modo da utilizzare le capacità necessarie solo attraverso i metodi di questi oggetti.

Non è consentito l'uso diretto di funzioni e costrutti del linguaggio. Questa attività utilizza il caricamento automatico della classe PHP. Lo spazio dei nomi è considerato come una raccolta di oggetti situati in una posizione specifica nel file system. Di solito tutti gli oggetti si trovano nel file system in base al loro significato, in cartelle e file con un nome specifico.

Il codice a sinistra indica la creazione dei cinque oggetti richiesti, ma non è indicato dove si trovino esattamente. Il codice a destra mostra il testo dell'autoloader (script principale), che, durante il caricamento delle classi (oggetti), sostituisce automaticamente il percorso richiesto con la posizione dell'oggetto e l'estensione del file .php.

Esempio di più spazi dei nomi

La libreria PhpOffice/PhpWord è un buon esempio di utilizzo di una gerarchia complessa di più spazi dei nomi. La cartella degli elementi contiene quasi l'intera gamma di elementi disponibili durante la creazione di un documento *.docx (MS Word), altre cartelle contengono gli strumenti necessari per lavorare con elementi, paragrafi e tabelle.

In realtà, la libreria è stata inserita nella cartella del progetto perché era necessario integrare lo spazio delle funzionalità PhpOffice / PhpWord con strumenti specifici e infine creare la propria versione di un prodotto simile.

Caricamento di molte classi di spazi dei nomi diversi

L'utilizzo del caricamento automatico dello spazio dei nomi PHP, quando è necessario caricare molte classi e la gerarchia del sistema di oggetti sviluppato è piuttosto complessa e difficile da immaginare, porta alla necessità di creare strutture rigide.

L'orientamento dello sviluppatore (chi utilizza il prodotto per continuare il lavoro) è possibile solo nel contesto della semantica (comprensione del progetto), che è rappresentata da appropriate combinazioni di parole che riflettono il significato reale e le relazioni degli oggetti.

La necessità di utilizzare la libreria in un singolo progetto porta a risolvere il problema di come combinare gli spazi dei nomi sviluppatore e autore PhpOffice / PhpWord. Il modo migliore è posizionare questo prodotto (i suoi spazi e oggetti) nel proprio spazio di progetto.

È importante notare che non sarà possibile fare a meno di modificare gli spazi dei nomi di questo prodotto a livello dei suoi elementi astratti e del caricamento delle classi. Ciò indica che nel namespace PHP l'uso dei namespace interni potrebbe non essere sufficientemente astratto e universale.

File system e localizzazione degli spazi

Essenzialmente, gli spazi dei nomi sono il "delineamento" del percorso nel file system verso l'oggetto desiderato. Usare i nomi dei file come nomi degli oggetti è naturale e comune. L'utilizzo dei nomi delle cartelle come denominazione dello spazio dei nomi è obiettivo.

L'organizzazione “in legno” delle informazioni è piuttosto macchinosa da usare e complica lo sviluppo, ma è una rappresentazione naturale per sistemi di oggetti.

Il problema è che la fase di sviluppo è rappresentata da uno specifico editor di codice, che combina sia la rappresentazione visibile delle cartelle sia il contenuto di una cartella specifica, ma non esiste ancora un editor che fornisca il movimento end-to-end attraverso gli oggetti e attraverso cartelle.

Il problema dell'astrazione e dell'universalità

Accettato dalla coscienza e dall'obiettivo dello sviluppatore nella realtà:

  • fornisce astrazione e capacità di manipolare le informazioni secondo la loro semantica reale;
  • gli spazi dei nomi riflettono la posizione degli script, degli oggetti e in parte il significato del progetto nel file system

Infatti, collegando l'astrazione OOP ai nomi degli oggetti (file) e sovrapponendola al file system (cartelle) con un'adeguata formazione degli spazi dei nomi (percorsi + nomi), è possibile controllare la formazione degli spazi dei nomi durante l'esecuzione dello script.

La programmazione ha già acquisito una potente dinamica di sviluppo, ma se trasferiamo il processo e il carico della fase di sviluppo da un editor di testo (in cui gli script vengono creati e inseriti in alberi di cartelle) all'idea di generare un codice che si lascia migliorare e collocare al posto giusto nel file system: la programmazione raggiungerà nuovi livelli.

Recentemente ho incapsulato il mio progetto in uno spazio dei nomi e ho riscontrato il problema della mancanza di documentazione adeguata. Tutto quello che siamo riusciti a trovare risale all'incirca al 2009, siamo quasi al 2012... Nel materiale trovato ci sono molti posti non lavorativi che utilizzano qualcosa che non è presente nella versione attuale di php. A questo proposito vorrei fare un po’ di luce su questa questione.
Quindi, cos'è uno spazio dei nomi o uno spazio dei nomi? La grande Wikipedia li definisce così:

Lo spazio dei nomi è un insieme, ovvero un modello, un archivio astratto o un ambiente creato per il raggruppamento logico di identificatori univoci (ovvero nomi). Un identificatore definito in uno spazio dei nomi è associato a quello spazio dei nomi. Lo stesso identificatore può essere definito in modo indipendente in più spazi. Pertanto, un valore associato a un identificatore definito in un namespace può (o non può) avere lo stesso significato (o piuttosto diverso) dello stesso identificatore definito in un altro namespace. I linguaggi che riconoscono lo spazio dei nomi definiscono regole che indicano a quale spazio dei nomi appartiene un identificatore (ovvero, la sua definizione).wiki

Tutto chiaro? In realtà è semplice. Prima della versione 5.3, c'erano solo due spazi in php: globale (in cui veniva eseguito il codice principale) e locale (in cui venivano definite le variabili di funzione).

Dalla versione 5.3 tutto è cambiato. Ora puoi definire il tuo spazio dei nomi in cui esisteranno le tue classi, metodi, ecc.


Spero che sia diventato un po' più chiaro.

Ho specificamente chiamato le classi allo stesso modo. Poiché sono definiti in spazi diversi, sono due classi diverse, nonostante gli stessi nomi. Lo script principale funziona ancora nello spazio globale, qui non è cambiato nulla e in esso si possono ancora definire classi e funzioni. Allora a cosa servono gli spazi? Prima di tutto, per assicurarti che quando includi un file con qualche framework o libreria, le tue classi non sovrascriveranno le classi del framework o viceversa.

Per utilizzare le classi definite nel tuo spazio dei nomi, devi importare lo spazio che definisci in quello globale nel posto giusto (di solito preferisco farlo all'inizio del file, per fare ciò, usa la parola chiave use).

Attenzione: per qualche motivo php non consente l'uso della parola chiave utilizzo in blocchi e loop di condizioni

Prendiamo l'esempio dalle immagini e lo implementiamo nel codice:

Attenzione: la parola chiave namespace deve trovarsi all'inizio del file, subito dopo
file A.php
File B.php
È possibile una sintassi alternativa:
Si consiglia di dichiarare ogni spazio dei nomi in un file separato. Sebbene sia possibile in uno, è severamente sconsigliato!
Passiamo ora al terzo file, in cui funzionerà il nostro script principale
indice.php
Sembrerebbe che questo sia un vantaggio, viene solo aggiunto più codice, ma questo non è del tutto vero, poco oltre darò un esempio di una classe di caricamento automatico, con la quale le linee che collegano i file alle classi non saranno necessarie.
Ora diamo un'occhiata alle nostre lezioni.

Attenzione: utilizzando l'operatore di risoluzione dell'ambito (::) negli spazi dei nomi php non autorizzato! L'unica cosa per cui è adatto è accedere a metodi e costanti di classi statiche. All'inizio volevano usarlo per il namespace, ma poi hanno deciso di non farlo a causa dei problemi che sono sorti. Pertanto, una costruzione come A::A::say(); non è valido e genererà un errore.

Per gli spazi dei nomi è necessario utilizzare il carattere barra rovesciata "\"
Attenzione: Per evitare malintesi è necessario utilizzare l'escape di questo carattere nelle stringhe: "\\"

Gli spazi dei nomi possono essere annidati uno dentro l'altro, aggiungiamolo al nostro file A.php:
e nell'indice scriveremo quanto segue:

Un punto importante è utilizzare gli alias per gli spazi importati. Potresti scrivere A\subA::say(); Concorderai che è difficile scrivere percorsi completi per gli spazi ogni volta che per evitarlo sono stati introdotti degli alias; Durante la compilazione accadrà quanto segue: al posto dell'alias sub verrà sostituito A\subA, quindi otterremo la chiamata A\subA::say();

Cosa succede allora quando si chiamano funzioni definite nello spazio globale? PHP cerca innanzitutto una funzione all’interno dello spazio in cui stai attualmente lavorando e, se non la trova, passa all’ambito globale. Per indicare immediatamente che stai utilizzando una funzione globale, devi farla precedere da una barra rovesciata.

Per evitare problemi con il caricamento automatico delle classi dagli spazi, il file system deve essere organizzato in modo simile all'organizzazione degli spazi. Ad esempio, abbiamo una cartella root classi, dove verranno archiviate le nostre classi, quindi i nostri spazi possono essere organizzati come segue
classi\A\A.php
classi\A\sub\A.php (il sottospazio verrà inserito in un file separato)
classi\B\B.php

PHP ha una costante magica __NAMESPACE__ che contiene il nome dello spazio corrente.

E ora riguardo al caricamento automatico.

La classe qui sotto non è mia, l'ho solo fatta funzionare e migliorata un po', presa da qui.
Attenzione: Affinché le tue classi possano essere caricate, il nome della classe deve corrispondere al nome del file!

" .$file ." in " .$filepath)); if (file_exists($filepath)) ( if(Autoloader::debug) Autoloader::StPutFile(("connected " .$filepath)); $flag = FALSE; require_once($filepath); break; ) Autoloader::recursive_autoload($file, $path2, &$flag); closedir($handle) funzione statica privata StPutFile($data) ( $dir = $_SERVER["DOCUMENT_ROOT"] ." Log/Log.html"; $file = fopen($dir, "a"); stormo($file, LOCK_EX); fwrite($file, ("║" .$data ."=>" .date(" d.m.Y Il suo") ."

" .PHP_EOL)); stormo($file, LOCK_UN); fclose ($file); ) ) \spl_autoload_register("yourNameSpace\Autoloader::autoload"); )
Se guardi i nomi delle classi che vengono caricate, vedrai che ciascuna classe è preceduta da un prefisso dello spazio dei nomi specificato in uso. Questo è il motivo per cui consiglio di utilizzare la posizione dei file in directory simili allo spazio dei nomi, questo velocizza la ricerca a una o due iterazioni;

Ora il nostro indice può essere scritto in questo modo:
Ora tutte le classi e le interfacce che utilizzerai verranno caricate automaticamente.

Per dimostrare alcune delle capacità dinamiche del linguaggio con gli spazi, dichiariamo un'altra classe:
prova.php

Indice.php
direNome("prova"); //oppure puoi fare questo test\sayName("test2"); //o così $obj::sayName("test"); //oppure puoi fare questo test::sayName("test2");

Spero che il mio articolo possa essere utile a qualcuno.

Ciao. Nell'articolo di oggi vedremo, cosa sono gli spazi dei nomi in PHP.

Se lo usi da molto tempo Ops, probabilmente ti sei imbattuto in una situazione in cui, collegando una libreria di terze parti, hai riscontrato un errore dovuto al fatto che stai già utilizzando gli stessi nomi di classe nel codice della libreria. Ciò può accadere soprattutto se usi nomi comuni come "modello", "db" e così via. Ti dirò come risolvere questo problema adesso.

Spazio dei nomi- si tratta di una sorta di archivio creato per il raggruppamento astratto di identificatori univoci (nomi).

Quelli. se usi spazi dei nomi, quindi puoi connettere in sicurezza librerie di terze parti e non aver paura che abbiano gli stessi nomi del tuo codice. Concludiamo con la teoria e passiamo alla pratica.

Creiamo un file miaclasse.php con questo contenuto

spazio dei nomi mio\oneProject;
classe La mia classe ( )
?>

Qui abbiamo creato una classe nel namespace mio\unProgetto. A proposito, devi scrivere esattamente la barra rovesciata. Non confonderti!

Ora in archivio indice.php scriviamo quanto segue

require_once("miaclasse.php");
$mc = nuova MiaClasse(); // Errore: classe non trovata
$mc = nuovo mio\unoProgetto\MiaClasse(); // funziona tutto
?>

Come puoi vedere, ora non è più possibile creare una classe così, devi specificare in quale spazio dei nomiè sdraiato.

Possiamo specificarne diversi contemporaneamente spazi dei nomi in un unico file

progetto dello spazio dei nomi;

Cost. CONNECT_OK = 1;
classe Connessione ( )
funzione connetti() ( )

NamespaceAnotherProject;

Cost. CONNECT_OK = 1;
classe Connessione ( )
funzione connetti() ( )
?>

Nonostante abbiamo nomi di classi, funzioni e costanti assolutamente identici, non avremo un conflitto di nomi, perché si trovano in spazi diversi.

Possiamo anche usare la sintassi delle parentesi.

Progetto dello spazio dei nomi (

Cost. CONNECT_OK = 1;
classe Connessione ( )
funzione connetti() ( )
}

Spazio dei nomi AnotherProject (

Cost. CONNECT_OK = 1;
classe Connessione ( )
funzione connetti() ( )
}
?>

Se combini il codice in spazio dei nomi globale con codice in altri spazi, viene utilizzata solo la sintassi con parentesi quadre.

Progetto dello spazio dei nomi (

Cost. CONNECT_OK = 1;
classe Connessione ( )
funzione connetti() ( )
}

Spazio dei nomi ( // codice globale
inizio_sessione();
$a = Progetto\connect();
echo Progetto\Connessione::start();
}
?>

Inoltre, non dimenticare che la definizione di uno spazio dei nomi dovrebbe sempre essere la prima riga di codice. Se scrivi così ci sarà un errore

Per scoprire in quale spazio dei nomi ti trovi attualmente, puoi utilizzare la costante __NAMESPACE__

progetto dello spazio dei nomi;
echo """, __NAMESPACE__, """; // stamperà "Progetto"
?>

Usando questa costante puoi, ad esempio, costruire dinamicamente nomi

progetto dello spazio dei nomi;

Funzione incl($nomeclasse) (
$a = __NAMESPACE__ . "\\" . $nomeclasse;
restituisce il nuovo $a;
}
?>

Quindi è tutto per oggi. Puoi ottenere maggiori informazioni e conoscenze pratiche frequentando il corso