PHP
Namespace
Ricerca…
Osservazioni
Dalla documentazione di 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 posti. Ad esempio, in qualsiasi directory del sistema operativo è possibile raggruppare file correlati e agire come spazio dei nomi per i file al loro interno. Come esempio concreto, il file foo.txt può esistere in entrambe le directory / home / greg e 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, dobbiamo anteporre il nome della directory al nome del file usando il separatore di directory per ottenere /home/greg/foo.txt. Questo stesso principio si estende ai namespace nel mondo della programmazione.
Nota che gli spazi dei nomi di primo livello PHP
e php
sono riservati al linguaggio PHP stesso. Non dovrebbero essere usati in alcun codice personalizzato.
Dichiarare spazi dei nomi
Una dichiarazione dello spazio dei nomi può avere il seguente aspetto:
-
namespace MyProject;
- Dichiara lo spazio dei nomiMyProject
-
namespace MyProject\Security\Cryptography;
- Dichiara uno spazio dei nomi annidato -
namespace MyProject { ... }
- Dichiara un namespace con parentesi graffe.
Si consiglia di dichiarare un singolo spazio dei nomi solo per file, anche se è possibile dichiararne il numero desiderato in un singolo file:
namespace First {
class A { ... }; // Define class A in the namespace First.
}
namespace Second {
class B { ... }; // Define class B in the namespace Second.
}
namespace {
class C { ... }; // Define class C in the root namespace.
}
Ogni volta che dichiari uno spazio dei nomi, le classi che definisci dopo apparterranno a tale spazio dei nomi:
namespace MyProject\Shapes;
class Rectangle { ... }
class Square { ... }
class Circle { ... }
Una dichiarazione dello spazio dei nomi può essere utilizzata più volte in file diversi. L'esempio sopra definito tre classi nello spazio dei nomi MyProject\Shapes
in un singolo file. Preferibilmente questo sarebbe diviso in tre file, ognuno a partire da namespace MyProject\Shapes;
. Questo è spiegato in modo più dettagliato nell'esempio standard PSR-4.
Fare riferimento a una classe o funzione in un namespace
Come mostrato in Dichiarare spazi dei nomi , possiamo definire una classe in uno spazio dei nomi come segue:
namespace MyProject\Shapes;
class Rectangle { ... }
Per fare riferimento a questa classe, è necessario utilizzare il percorso completo (incluso lo spazio dei nomi):
$rectangle = new MyProject\Shapes\Rectangle();
Questo può essere abbreviato importando la classe tramite l' use
-statement:
// Rectangle becomes an alias to MyProject\Shapes\Rectangle
use MyProject\Shapes\Rectangle;
$rectangle = new Rectangle();
Per quanto riguarda PHP 7.0 è possibile raggruppare vari use
-statements in una singola istruzione usando parentesi:
use MyProject\Shapes\{
Rectangle, //Same as `use MyProject\Shapes\Rectangle`
Circle, //Same as `use MyProject\Shapes\Circle`
Triangle, //Same as `use MyProject\Shapes\Triangle`
Polygon\FiveSides, //You can also import sub-namespaces
Polygon\SixSides //In a grouped `use`-statement
};
$rectangle = new Rectangle();
A volte due classi hanno lo stesso nome. Questo non è un problema se si trovano in un namespace diverso, ma potrebbe diventare un problema quando si tenta di importarli con l' use
-statement:
use MyProject\Shapes\Oval;
use MyProject\Languages\Oval; // Apparantly Oval is also a language!
// Error!
Questo può essere risolto definendo un nome per l'alias usando la parola chiave as
:
use MyProject\Shapes\Oval as OvalShape;
use MyProject\Languages\Oval as OvalLanguage;
Per fare riferimento a una classe al di fuori dello spazio dei nomi corrente, è necessario eseguire l'escape con un \
, altrimenti viene assunto un percorso relativo al namespace dallo spazio dei nomi corrente:
namespace MyProject\Shapes;
// References MyProject\Shapes\Rectangle. Correct!
$a = new Rectangle();
// References MyProject\Shapes\Rectangle. Correct, but unneeded!
$a = new \MyProject\Shapes\Rectangle();
// References MyProject\Shapes\MyProject\Shapes\Rectangle. Incorrect!
$a = new MyProject\Shapes\Rectangle();
// Referencing StdClass from within a namespace requires a \ prefix
// since it is not defined in a namespace, meaning it is global.
// References StdClass. Correct!
$a = new \StdClass();
// References MyProject\Shapes\StdClass. Incorrect!
$a = new StdClass();
Cosa sono i Namespace?
La comunità PHP ha molti sviluppatori che creano molto codice. Ciò significa che il codice PHP di una libreria può utilizzare lo stesso nome di classe di un'altra libreria. Quando entrambe le librerie sono utilizzate nello stesso spazio dei nomi, si scontrano e causano problemi.
I namespace risolvono questo problema. Come descritto nel manuale di riferimento di PHP, gli spazi dei nomi possono essere confrontati con le directory del sistema operativo che i file dello spazio dei nomi; due file con lo stesso nome possono coesistere in directory separate. Allo stesso modo, due classi PHP con lo stesso nome possono coesistere in spazi dei nomi PHP separati.
È importante per te assegnare un nome al tuo codice in modo che possa essere utilizzato da altri sviluppatori senza temere di scontrarsi con altre librerie.
Dichiarazione di sottonome spazi
Per dichiarare un singolo spazio dei nomi con gerarchia usa il seguente esempio:
namespace MyProject\Sub\Level;
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
L'esempio sopra crea:
costante MyProject\Sub\Level\CONNECT_OK
classe MyProject\Sub\Level\Connection
e
funzione MyProject\Sub\Level\connect