Cosa sono gli spazi dei nomi?


241

Cosa sono gli spazi dei nomi PHP?

Quali sono gli spazi dei nomi in generale?

Una risposta di Layman con un esempio sarebbe grandiosa.

Risposte:


574

Lo spazio dei nomi fa per funzioni e classi quale ambito fa per le variabili. Ti consente di utilizzare la stessa funzione o nome della classe in diverse parti dello stesso programma senza causare una collisione del nome.

In termini semplici, pensa a uno spazio dei nomi come al cognome di una persona . Se ci sono due persone di nome "John", puoi usare i loro cognomi per distinguerli.

Lo scenario

Supponiamo di scrivere un'applicazione che utilizza una funzione denominata output(). La tua output()funzione prende tutto il codice HTML sulla tua pagina e lo invia all'utente.

Successivamente l'applicazione diventa più grande e si desidera aggiungere nuove funzionalità. Aggiungi una libreria che ti consente di generare feed RSS. Questa libreria utilizza anche una funzione denominata output()per generare il feed finale.

Quando chiami output(), come fa PHP a sapere se usare la tua output()funzione o la funzione della libreria RSS output()? Non A meno che tu non stia usando gli spazi dei nomi.

Esempio

Come risolviamo avere due output()funzioni? Semplice. Attacchiamo ogni output()funzione nel suo spazio dei nomi .

Sarebbe simile a questo:

namespace MyProject;

function output() {
    # Output HTML page
    echo 'HTML!';
}

namespace RSSLibrary;

function output(){
    # Output RSS feed
    echo 'RSS!';
}

Più tardi, quando vogliamo utilizzare le diverse funzioni, utilizziamo:

\MyProject\output();
\RSSLibrary\output();

Oppure possiamo dichiarare di trovarci in uno degli spazi dei nomi e quindi possiamo semplicemente chiamare quello spazio dei nomi output():

namespace MyProject;

output(); # Output HTML page
\RSSLibrary\output();

Nessuno spazio dei nomi?

Se non avessimo spazi dei nomi, dovremmo (potenzialmente) cambiare molto codice ogni volta che aggiungiamo una libreria o trovare noiosi prefissi per rendere unici i nomi delle nostre funzioni. Con gli spazi dei nomi, possiamo evitare il mal di testa delle collisioni di denominazione quando mescoliamo codice di terze parti con i nostri progetti.


Per qualche ragione ho pensato che se avessi usato gli spazi dei nomi in file1 che non avresti dovuto richiedere o includere il file in file2. I test unitari hanno dimostrato che non è così.
Aaron Bell,

1
@AaronBell Potresti voler controllare il caricamento automatico .
cbednarski,

21

Uno spazio dei nomi consente di posizionare un gruppo di codice sotto un nome e di non avere conflitti di denominazione con classi, funzioni e costanti.

Permette al tuo codice di vivere in quello spazio dei nomi.

PHP usa il carattere alquanto controverso \ per mostrare i livelli dello spazio dei nomi. Le persone si sono alzate in braccio perché è anche usato come personaggio di fuga.

Per usare lo spazio dei nomi in PHP, usa qualcosa di simile in cima al tuo file.

namespace my\namespace;

Puoi trovare molte più informazioni sulla documentazione ufficiale di PHP per gli spazi dei nomi .


11

Dato che è più facile conoscere la parola chiave "usa" conoscendo "spazio dei nomi", permettimi di spiegare prima lo spazio dei nomi guardando un progetto Laravel di base.

Esiste una classe controller con il nome: Controller.php che si trova nel percorso: app / Http / Controller dalla directory principale del progetto C'è anche un'altra classe controller denominata: Controller.php , ma questa è nel percorso: vendor / laravel / framework / src / Illuminate / Routing dalla directory principale del progetto

Non hai ancora bisogno di guardare il codice sorgente se sei nuovo a php perché può confonderti, invece lascia che ti spieghi la parte di cui ci preoccupiamo e che ci aiuterà a capire "namespace" e "use ”.

Quindi, in effetti, la nostra prima classe di controller: app / Http / Controller / Controller.php deve utilizzare il fornitore della seconda classe di controller / laravel / framework / src / Illuminate / Routing / Controller.php . deve effettivamente estendere questa classe per avere accesso al suo contenuto per la gestione di alcune funzionalità di routing cruciali.

Quindi, come può una classe estendere un'altra classe con lo stesso nome? class Controller extends Controller? questo NON funzionerà, a meno che non ci sia un modo per distinguere queste due classi ed è qui che namespaceè utile e la useparola chiave aiuta a completare la missione di, consentendo l'utilizzo di; (classi; metodi; interfacce e costanti), con lo stesso nome, nello stesso ambito.

ora come si fa nel codice? molto semplice! se guardiamo ilcodice sorgente app / Http / Controllers / Controller.php , possiamo vedere che lo spazio dei nomi della classe è dichiarato come:,namespace App\Http\Controllersquindi è così che dai alla tua classe uno spazio dei nomi in modo che possa essere referenziato da altre classi ora questo sembra uguale al percorso di questa classe dalla directory principale del progetto, con poca differenza e questo è l'uso di “\” invece di “/ (lo stesso del prompt dei comandi in Windows) , ma c'è un'altra differenza e questa è l'App con capitale "A" nello spazio dei nomi rispetto a "app" con "a" minuscola nel percorso. Si noti inoltre che lo spazio dei nomi fa distinzione tra maiuscole e minuscole.

Quindi lo spazio dei nomi è un concetto separato rispetto al percorso, può seguire la struttura del percorso se aiuta ma non deve essere il percorso esatto per la classe, il metodo, le interfacce o le costanti, ad esempio dare un'occhiata a: vendor / laravel / framework /src/Illuminate/Routing/Controller.php codice sorgente,

vediamo in cima alla classe lo spazio dei nomi è dichiarato come: Illuminate\Routing

ora diamo un'occhiata alla useparola chiave " ", usiamo, la useparola chiave " " per rendere la nostra classe consapevole di una specifica classe o funzione che vogliamo usare nella nostra classe

quindi non stiamo importando o includendo qualsiasi cosa stiamo solo facendo sapere alla nostra classe che useremo una classe o un metodo specifici facendo riferimento a loro dal loro spazio dei nomi diamo un'occhiata al codice sorgente app / Http / Controllers / Controller.php , come puoi vedere dalla riga: “ use Illuminate\Routing\Controller as BaseController”, la useparola chiave “ ” seguita dallo spazio dei nomi per la classe target (nota che Illuminate \ Routing \ Controller.php e Illuminate \ Routing \ Controller 'senza estensione .php' sono intercambiabili)

possiamo usare la asparola chiave " " insieme alla useparola chiave " " per dare a una classe, un metodo, interfacce o costanti specifici un alias che consenta a app / Http / Controller / Controller.php di estendere Illuminate \ Routing \ Controller.php come BaseController nel linea: “ class Controller extends BaseController”.


9

Esistono tecniche come spazi dei nomi in altri linguaggi di programmazione (come pacchetti in Java). Sono abituati a poter avere classi multiple con lo stesso nome in un progetto.

Dalla documentazione php ( http://www.php.net/manual/en/language.namespaces.rationale.php ):

Cosa sono gli spazi dei nomi? Nella definizione più ampia gli spazi dei nomi sono un modo per incapsulare gli oggetti. Questo può essere visto come un concetto astratto in molti luoghi. Ad esempio, in qualsiasi directory del sistema operativo servono per raggruppare i file correlati e fungere da spazio dei nomi per i file al loro interno. Come esempio concreto, il file foo.txt può esistere sia nella directory / home / greg che in / home / other, ma due copie di foo.txt non possono coesistere nella stessa directory. Inoltre, per accedere al file foo.txt al di fuori della directory / home / greg, è necessario anteporre il nome della directory al nome del file utilizzando il separatore di directory per ottenere /home/greg/foo.txt. Questo stesso principio si estende agli spazi dei nomi nel mondo della programmazione.


1
Il confronto con Java è una cattiva idea. Java ha pacchetti e ci sono classi di visibilità dei pacchetti. La visibilità dei membri protetti dipende anche dal pacchetto che vi accede.
Artefacto,

1
Non sono uguali ai pacchetti ma condividono la stessa idea.
2ndkauboy,

Poiché la domanda pone anche quali spazi dei nomi sono in generale, la risposta ha senso.
kiamlaluno,

@kiam Condividono un'idea: nomi di classi non contrastanti. Non condividono l'idea di visibilità.
Artefacto

@Artefacto: Kau-Boy non ha detto che gli spazi dei nomi in entrambe le lingue erano uguali.
kiamlaluno,

4

Proprio come directory e file , lo spazio dei nomi in PHP serve a raggruppare classi , funzioni , interfacce e costanti .

Esempio:

Filesystem      |   PHP Namespace
----------------|------------------
/Dir/File.txt   |  \Namespace\Class

Fornisce un modo per avvolgere oggetti dallo spazio globale e consente l'uso di un semplice nome di elemento senza causare la collisione del nome in un programma. È supportato in PHP 5.3.0, PHP 7.

Ma ci sono alcuni limiti in analogia tra lo spazio dei nomi PHP e il filesystem basato su Unix:

                          | Filesystem            |        PHP Namespace
--------------------------|-----------------------|-------------------------
Cas sensitive             |       No              |        Yes                
--------------------------|-----------------------|-------------------------
Name with plain number    |       Yes             |        No
--------------------------|-----------------------|-------------------------
Path level                |       Yes             |        Yes   
--------------------------|-----------------------|-------------------------
Plain metacharacters name |       Yes             |        No        

Il principio si estende allo spazio dei nomi nella parola di programmazione.


3

Uno spazio dei nomi funziona come una directory. Sai come puoi mettere i file in una directory con gli stessi nomi dei file nella directory principale (o qualsiasi altra)? Bene, uno spazio dei nomi ti consente di farlo all'interno di un'applicazione per variabili, funzioni e classi.

C'è stato un po 'di tendenza in PHP qualche tempo fa per enormi classi di funzioni statiche. L'unico modo per chiamare una qualsiasi di queste funzioni era il prefisso di una chiamata con il nome della classe. Questo è stato un tentativo primitivo di spazi dei nomi, ma con non molti dei vantaggi.


2

Uno spazio dei nomi in pratica consente di inserire il codice in un contenitore. Ciò eviterà problemi con due funzioni (oltre a classi e variabili) che condividono lo stesso nome.

Questi sono utili quando si lavora in applicazioni più grandi per prevenire problemi con parti di codice che condividono lo stesso nome.

Ad esempio, supponiamo di volere due funzioni chiamate "TheMessage". Entrambi stamperebbero (eco) messaggi diversi ciascuno. Normalmente, ciò causerebbe un errore di sintassi, poiché non è possibile avere due funzioni che condividono lo stesso nome.

Per risolvere questo problema, è possibile inserire queste funzioni in spazi dei nomi separati. Ciò consentirebbe di utilizzare entrambe le funzioni senza errori.


2

Lo spazio dei nomi è come impacchettare molte cose in un unico pacchetto. Immagina uno spazio dei nomi come un cassetto in cui puoi mettere ogni genere di cose: una matita, un righello, un pezzo di carta e così via. Per evitare di usare gli altri oggetti, decidi di etichettare i cassetti in modo che sia chiaro ciò che appartiene a chi.


0

Lo spazio dei nomi viene utilizzato per racchiudere un gruppo di codici in modo che possano essere utilizzati in luoghi diversi senza conflitti di nomi. Pensa a questo come metodo jQuery senza conflitto e lo capirai meglio.


Cosa intendi con "metodo jQuery senza conflitto"? Che relazione c'è con PHP?
Nico Haase,

0

Uno spazio dei nomi è un sistema semplice per controllare i nomi in un programma.
Assicura che i nomi siano univoci e non causino conflitti.


Di quali tipi di "nomi" stai parlando?
Nico Haase,

0

È possibile utilizzare lo spazio dei nomi per evitare collisioni di nomi tra il codice creato e le classi / funzioni / costanti PHP interne o le classi / funzioni / costanti di terze parti. Gli spazi dei nomi hanno anche la possibilità di alias (o abbreviare) Extra_Long_Names progettati per ridurre il primo problema, migliorando la leggibilità del codice sorgente.

Come tutti sappiamo, gli spazi dei nomi e i tratti non sono nuovi in ​​PHP, ma molti sviluppatori php non usano questi grandi concetti a causa della loro complessità. Quindi, in questo post. Proverò a cancellarli con esempi. Cosa sono i namespace e i tratti?

Come puoi implementarli nel tuo codice per renderlo riutilizzabile ed estensibile?

Vantaggi degli spazi dei nomi

È possibile utilizzare lo spazio dei nomi per evitare collisioni di nomi tra il codice creato e le classi / funzioni / costanti PHP interne o le classi / funzioni / costanti di terze parti.

Gli spazi dei nomi hanno anche la possibilità di alias (o abbreviare) Extra_Long_Names progettati per ridurre il primo problema, migliorando la leggibilità del codice sorgente. Comprendiamo gli spazi dei nomi con un esempio. creare un nome di cartella "php_oops" in htdocs (xampp) o www (xwamp) creare una nuova cartella nella directory principale denominata "namespace", quindi creare un file index.php nella cartella namespace.

<?php
// FilePath:- namespaces/index.php

// let's say, we have two classes in index,
// here, these two classes have global space
class A 
{ 
   function __construct()
   { 
      echo "I am at Global space, Class A";
   }
}
class B
{
   function __construct()
   {
      echo "I am at Global space, Class B";
   }
}
// now create an object of class and 
$object = new A; // unqualified class name
echo "<br/>";
$object = new \B; // fully qualified class name
// output: 
I am at Global space, Class A
I am at Global space, Class B

Riferimento- https://medium.com/@akgarg007/php-laravel-namespaces-and-traits-01-9540fe2969cb


1
Si prega di fare attenzione con il collegamento ai propri contenuti su siti diversi, non si desidera essere uno spammer . Dovresti includere qui la maggior parte dei contenuti e utilizzare il link solo come riferimento.
Dharman,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.