php - qué - que es namespace en c#
¿Qué son los espacios de nombres? (8)
Al igual que los directorios y archivos , el espacio de nombres en PHP sirve para agrupar clases , funciones , interfaces y constantes .
Ejemplo:
Filesystem | PHP Namespace
----------------|------------------
/Dir/File.txt | /Namespace/Class
Proporciona una forma de envolver elementos del espacio global y permite el uso del nombre de elemento simple sin causar una colisión de nombre en un programa. Es compatible con PHP 5.3.0, PHP 7.
Pero hay algunos límites en la analogía entre el espacio de nombres PHP y el sistema de archivos basado en Unix:
| Filesystem | PHP Namespace
--------------------------|-----------------------|-------------------------
Cas sensitive | No | Yes
--------------------------|-----------------------|-------------------------
Name with plain number | Yes | No
--------------------------|-----------------------|-------------------------
Path level | Yes | Yes
--------------------------|-----------------------|-------------------------
Plain metacharacters name | Yes | No
El principio se extiende al espacio de nombres en la palabra de programación.
¿Qué son espacios de nombres PHP?
¿Qué son los espacios de nombres en general?
Una respuesta Layman con un ejemplo sería genial.
Dado que es más fácil aprender sobre la palabra clave "usar" al conocer el "espacio de nombres", permítanme explicar el espacio de nombres primero mirando un proyecto básico de Laravel.
Hay una clase de controlador con el nombre: Controller.php que está en la ruta: app / Http / Controllers del directorio raíz del proyecto. También hay otra clase de controlador llamada: Controller.php , pero esta está en la ruta: vendor / laravel / framework / src / Illuminate / Routing del directorio raíz del proyecto
No necesita mirar el código fuente aún si es nuevo en php porque puede confundirlo, en su lugar déjeme explicarle la parte que nos importa y nos ayudará a entender el "espacio de nombres" y el "uso". ".
Así que, de hecho, nuestra primera clase de controlador: app / Http / Controllers / Controller.php necesita usar el proveedor de la clase de segundo controlador / laravel / framework / src / Illuminate / Routing / Controller.php . en realidad necesita extender esta clase para tener acceso a su contenido para manejar algunas funcionalidades de enrutamiento cruciales.
Entonces, ¿cómo puede una clase extender otra clase que tenga el mismo nombre? class Controller extends Controller
? esto NO funcionará, a menos que haya una forma de distinguir estas dos clases y es ahí donde el namespace
es útil y la palabra clave use
ayuda a completar la misión de, permitiendo el uso de; (clases, métodos, interfaces y constantes), con el mismo nombre, en el mismo ámbito.
ahora ¿cómo se hace en el código? ¡muy simple! si miramos el código fuente de la aplicación / Http / Controllers / Controller.php , podemos ver que en la parte superior del espacio de nombres de la clase se declara como: namespace App/Http/Controllers
, así es como le das a tu clase un espacio de nombres para que pueda ser referenciado por otras clases ahora esto se ve igual a la ruta a esta clase desde el directorio raíz del proyecto, con poca diferencia y ese es el uso de " /
" en lugar de " /
" (igual que el símbolo del sistema en Windows) , pero hay otra diferencia y esa es la aplicación con mayúscula ''A'' en el espacio de nombres frente a ''aplicación'' con minúscula ''a'' en la ruta. También tenga en cuenta que el espacio de nombres distingue entre mayúsculas y minúsculas.
Así que el espacio de nombres es un concepto separado de la ruta, puede seguir la estructura de la ruta si ayuda pero no tiene que ser una ruta exacta a la clase, método, interfaces o constantes, por ejemplo, eche un vistazo a: vendor / laravel / framework /src/Illuminate/Routing/Controller.php código fuente,
vemos en la parte superior de la clase que el espacio de nombres se declara como: Illuminate/Routing
ahora echemos un vistazo a la palabra clave " use
", que usamos, la palabra clave " use
" para que nuestra clase tome conciencia de una clase o función específica que queremos usar en nuestra clase
por lo que no estamos importando ni incluyendo nada . Solo le estamos diciendo a nuestra clase que utilizaremos una clase o método específico haciendo referencia a ellos por su espacio de nombres. Echemos un vistazo al código fuente de la aplicación / Http / Controllers / Controller.php , como se puede ver desde la línea: " use Illuminate/Routing/Controller as BaseController
", la palabra clave " use
" seguida del espacio de nombres para la clase de destino (tenga en cuenta que Illuminate / Routing / Controller.php e Illuminate / Routing / Controller ''sin .php la extensión ''son intercambiables)
podemos usar la palabra clave " as
" junto con la palabra clave " use
" para dar un alias a una clase, método, interfaz o constantes específico que permita a la aplicación / Http / Controllers / Controller.php extender Illuminate / Routing / Controller.Controller.php como BaseController en la línea: " class Controller extends BaseController
".
El espaciado de nombres hace para las funciones y las clases lo que hace el alcance para las variables. Le permite usar la misma función o nombre de clase en diferentes partes del mismo programa sin causar una colisión de nombre.
En términos simples, piense en un espacio de nombres como el apellido de una persona . Si hay dos personas llamadas "John", puedes usar sus apellidos para diferenciarlas.
El escenario
Supongamos que escribe una aplicación que usa una función llamada output()
. Su función output()
toma todo el código HTML en su página y lo envía al usuario.
Más tarde, su aplicación se hace más grande y desea agregar nuevas funciones. Agrega una biblioteca que le permite generar fuentes RSS. Esta biblioteca también usa una función llamada output()
para generar el feed final.
Cuando llama a output()
, ¿cómo sabe PHP si usar su función output()
o la función output()
la biblioteca RSS? No es así A menos que estés usando espacios de nombres.
Ejemplo
¿Cómo resolvemos tener dos funciones de output()
? Sencillo. Pegamos cada función output()
en su propio namespace .
Eso se vería así:
namespace MyProject;
function output() {
# Output HTML page
echo ''HTML!'';
}
namespace RSSLibrary;
function output(){
# Output RSS feed
echo ''RSS!'';
}
Luego, cuando deseemos usar las diferentes funciones, usaríamos:
/MyProject/output();
/RSSLibrary/output();
O podemos declarar que estamos en uno de los espacios de nombres y luego podemos simplemente llamar a la output()
del espacio de nombres output()
:
namespace MyProject;
output(); # Output HTML page
/RSSLibrary/output();
Sin espacios de nombres?
Si no tuviéramos espacios de nombres, tendríamos que (potencialmente) cambiar una gran cantidad de código cada vez que añadiéramos una biblioteca, o crearíamos prefijos tediosos para que nuestros nombres de funciones fueran únicos. Con espacios de nombres, podemos evitar el dolor de cabeza de nombrar colisiones al mezclar código de terceros con nuestros propios proyectos.
El espacio de nombres es como empaquetar muchas cosas en un solo paquete. Imagine un espacio de nombres como un cajón en el que puede colocar todo tipo de cosas: un lápiz, una regla, un trozo de papel, etc. Para evitar usar los elementos de los demás, decide etiquetar los cajones para que quede claro lo que le pertenece a quién.
Existen técnicas como espacios de nombres en otros lenguajes de programación (como paquetes en Java). Se usan para poder tener varias clases con el mismo nombre dentro de un proyecto.
De la documentación php ( namespace ):
¿Qué son los espacios de nombres? En la definición más amplia, los espacios de nombres son una forma de encapsular elementos. Esto se puede ver 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 dentro de ellos. 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 anteponer el nombre del directorio al nombre del archivo utilizando el separador del directorio para obtener /home/greg/foo.txt. Este mismo principio se extiende a los espacios de nombres en el mundo de la programación.
Un Namespace funciona como un directorio. ¿Sabe cómo puede colocar los archivos en un directorio con los mismos nombres que los archivos en el directorio principal (o en cualquier otro)? Bueno, un espacio de nombres te permite hacer eso dentro de una aplicación para variables, funciones y clases.
Hubo una pequeña tendencia en PHP hace un tiempo para grandes clases de funciones estáticas. La única forma de llamar a cualquiera de esas funciones era prefijando una llamada con el nombre de la clase. Este fue un intento primitivo de espacios de nombres, pero con no mucho de los beneficios.
Un espacio de nombre le permite colocar un montón de código bajo un nombre y no tener conflictos de nomenclatura con clases, funciones y constantes.
Le permite a su código vivir en ese espacio de nombres.
PHP usa el carácter un tanto controvertido /
para mostrar niveles de espacio de nombres. La gente se levantó en armas porque también se usa como un personaje de escape.
Para usar el espacio de nombres en PHP, use algo como esto en la parte superior de su archivo.
namespace my/namespace;
Puede encontrar mucha más información en la documentación oficial de PHP para espacios de nombres .
Un espacio de nombres básicamente le permite poner código en un contenedor. Esto evitará problemas con dos funciones (así como clases y variables) que comparten el mismo nombre.
Estos son útiles cuando se trabaja con aplicaciones más grandes para evitar problemas con partes de código que comparten el mismo nombre.
Por ejemplo, digamos que queríamos dos funciones llamadas "TheMessage". Ambos imprimirían (repetirán) mensajes diferentes cada uno. Normalmente, esto causaría un error de sintaxis, ya que no puede tener dos funciones que comparten el mismo nombre.
Para solucionar esto, puede poner estas funciones en espacios de nombres separados. Esto le permitiría usar ambas funciones sin ningún error.