PHP
Espacios de nombres
Buscar..
Observaciones
De la documentación de PHP :
¿Qué son los espacios de nombres? En la definición más amplia, los espacios de nombres son una forma de encapsular elementos. Esto puede verse como un concepto abstracto en muchos lugares. Por ejemplo, en cualquier sistema operativo, los directorios sirven para agrupar archivos relacionados y actúan como un espacio de nombres para los archivos que contienen. Como ejemplo concreto, el archivo foo.txt puede existir tanto en el directorio / home / greg como en / home / other, pero dos copias de foo.txt no pueden coexistir en el mismo directorio. Además, para acceder al archivo foo.txt fuera del directorio / home / greg, debemos añadir el nombre del directorio al nombre del archivo usando el separador de directorios para obtener /home/greg/foo.txt. Este mismo principio se extiende a los espacios de nombres en el mundo de la programación.
Tenga en cuenta que los espacios de nombres de nivel superior PHP
y php
están reservados para el propio lenguaje PHP. No deben utilizarse en ningún código personalizado.
Declarando espacios de nombres
Una declaración de espacio de nombres puede verse como sigue:
-
namespace MyProject;
- Declarar el espacio de nombresMyProject
-
namespace MyProject\Security\Cryptography;
- Declarar un espacio de nombres anidado -
namespace MyProject { ... }
: declara un espacio de nombres entre paréntesis.
Se recomienda declarar solo un único espacio de nombres por archivo, aunque puede declarar tantos como desee en un solo archivo:
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.
}
Cada vez que declare un espacio de nombres, las clases que defina después pertenecerán a ese espacio de nombres:
namespace MyProject\Shapes;
class Rectangle { ... }
class Square { ... }
class Circle { ... }
Una declaración de espacio de nombres se puede utilizar varias veces en diferentes archivos. El ejemplo anterior definió tres clases en el espacio de nombres MyProject\Shapes
en un solo archivo. Preferiblemente, esto se dividiría en tres archivos, cada uno comenzando con el namespace MyProject\Shapes;
. Esto se explica con más detalle en el ejemplo estándar de PSR-4.
Hacer referencia a una clase o función en un espacio de nombres
Como se muestra en Declaración de espacios de nombres , podemos definir una clase en un espacio de nombres de la siguiente manera:
namespace MyProject\Shapes;
class Rectangle { ... }
Para hacer referencia a esta clase, se debe utilizar la ruta completa (incluido el espacio de nombres):
$rectangle = new MyProject\Shapes\Rectangle();
Esto se puede reducir importando la clase a través de la declaración de use
:
// Rectangle becomes an alias to MyProject\Shapes\Rectangle
use MyProject\Shapes\Rectangle;
$rectangle = new Rectangle();
En cuanto a PHP 7.0, puede agrupar varias declaraciones de use
en una sola declaración utilizando corchetes:
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 veces dos clases tienen el mismo nombre. Esto no es un problema si se encuentran en un espacio de nombres diferente, pero podría convertirse en un problema al intentar importarlos con la declaración de use
:
use MyProject\Shapes\Oval;
use MyProject\Languages\Oval; // Apparantly Oval is also a language!
// Error!
Esto se puede resolver definiendo un nombre para el alias usando la palabra clave as
:
use MyProject\Shapes\Oval as OvalShape;
use MyProject\Languages\Oval as OvalLanguage;
Para hacer referencia a una clase fuera del espacio de nombres actual, debe escaparse con una \
, de lo contrario se asume una ruta de espacio de nombres relativa a partir del espacio de nombres actual:
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();
¿Qué son los espacios de nombres?
La comunidad de PHP tiene muchos desarrolladores que crean muchos códigos. Esto significa que el código PHP de una biblioteca puede usar el mismo nombre de clase que otra biblioteca. Cuando ambas bibliotecas se usan en el mismo espacio de nombres, chocan y causan problemas.
Los espacios de nombres resuelven este problema. Como se describe en el manual de referencia de PHP, los espacios de nombres se pueden comparar con los directorios del sistema operativo que contienen los archivos de espacios de nombres; dos archivos con el mismo nombre pueden coexistir en directorios separados. Del mismo modo, dos clases de PHP con el mismo nombre pueden coexistir en espacios de nombres de PHP separados.
Es importante que escriba un espacio de nombre en su código para que otros desarrolladores puedan utilizarlo sin temor a colisionar con otras bibliotecas.
Declarar sub-espacios de nombres
Para declarar un solo espacio de nombres con jerarquía, utilice el siguiente ejemplo:
namespace MyProject\Sub\Level;
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
El ejemplo anterior crea:
constante MyProject\Sub\Level\CONNECT_OK
clase MyProject\Sub\Level\Connection
y
función MyProject\Sub\Level\connect