¿Qué son los espacios de nombres?

241

¿Qué son los espacios de nombres PHP?

¿Qué son los espacios de nombres en general?

Una respuesta laica con un ejemplo sería genial.

Imran
fuente

Respuestas:

573

El espacio de nombres hace para funciones y clases lo que hace el alcance para variables. Le permite usar la misma función o nombre de clase en diferentes partes del mismo programa sin causar una colisión de nombres.

En términos simples, piense en un espacio de nombres como el apellido de una persona . Si hay dos personas llamadas "John", puede usar sus apellidos para distinguirlos.

El escenario

Supongamos que escribe una aplicación que usa una función llamada output(). Su output()función toma todo el código HTML en su página y lo envía al usuario.

Más adelante, 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 nombrada output()para generar el feed final.

Cuando llama output(), ¿cómo sabe PHP si usar su output()función o la función de la biblioteca RSS output()? No lo hace. A menos que esté utilizando espacios de nombres.

Ejemplo

¿Cómo resolvemos tener dos output()funciones? Sencillo. Pegamos cada output()función en su propio espacio de nombres .

Eso se vería así:

namespace MyProject;

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

namespace RSSLibrary;

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

Más tarde, cuando queramos 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 llamar a ese 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 cambiar (potencialmente) mucho código cada vez que agregamos una biblioteca, o crear prefijos tediosos para que nuestros nombres de funciones sean únicos. Con espacios de nombres, podemos evitar el dolor de cabeza de nombrar colisiones al mezclar código de terceros con nuestros propios proyectos.

Cbednarski
fuente
Por alguna razón, pensé que si usabas espacios de nombres en el archivo 1, no tendrías que requerir ni incluir el archivo en el archivo 2. Las pruebas unitarias mostraron que este no es el caso.
Aaron Bell
1
@AaronBell Es posible que desee comprobar la carga automática .
cbednarski el
21

Un espacio de nombres le permite colocar un montón de código debajo de un nombre y no tener conflictos de nombres con clases, funciones y constantes.

Permite que su código viva en ese espacio de nombres.

PHP usa el carácter algo controvertido \ para mostrar los niveles de espacio de nombres. La gente se levantó en brazos 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 .

alex
fuente
11

Dado que es más fácil aprender acerca de la palabra clave "uso" al conocer el "espacio de nombres", permítanme explicar primero el espacio de nombres 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 desde el 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 desde el directorio raíz del proyecto

No necesita mirar el código fuente todavía si es nuevo en php porque puede confundirlo, en cambio permítame explicarle la parte que nos interesa y nos ayudará a entender el "espacio de nombres" y "usar ".

De hecho, nuestra primera clase de controlador: app / Http / Controllers / Controller.php necesita usar el segundo proveedor de clase de 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 tiene el mismo nombre? class Controller extends Controller? esto NO funcionará, a menos que haya una manera de distinguir estas dos clases y ahí es donde namespaceresulta útil y la usepalabra clave 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 elcó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\Controllersasí es como le da a su clase un espacio de nombres para que otras clases puedan hacer referencia a él ahora esto se ve igual que 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 versus 'aplicación' con minúsculas 'a' en la ruta. También tenga en cuenta que el espacio de nombres distingue entre mayúsculas y minúsculas.

Entonces, 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 la 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 el espacio de nombres se declara como: Illuminate\Routing

ahora echemos un vistazo a la usepalabra clave " ", usamos, la usepalabra clave " " para que nuestra clase conozca una clase o función específica que queremos usar en nuestra clase

así que no estamos importando o incluyendo nada , solo estamos informando a nuestra clase que usaremos una clase o método específico al hacer referencia a ellos por su espacio de nombres, echemos un vistazo al código fuente de app / Http / Controllers / Controller.php , como puede ver desde la línea: " use Illuminate\Routing\Controller as BaseController", la usepalabra clave " " seguida del espacio de nombres para la clase de destino (tenga en cuenta que Illuminate \ Routing \ Controller.php e Illuminate \ Routing \ Controller 'sin extensión .php' son intercambiables)

podemos usar la aspalabra clave " " junto con la usepalabra clave " " para dar a una clase específica , método, interfaces o constantes un alias que permita a app / Http / Controllers / Controller.php extender Illuminate \ Routing \ Controller.php como BaseController en línea: " class Controller extends BaseController".

Bahman.A
fuente
9

Existen técnicas como espacios de nombres en otros lenguajes de programación (como paquetes en Java). Están acostumbrados a poder tener varias clases con el mismo nombre en un proyecto.

De la documentación de php ( http://www.php.net/manual/en/language.namespaces.rationale.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 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 usando el separador de directorio para obtener /home/greg/foo.txt. Este mismo principio se extiende a los espacios de nombres en el mundo de la programación.

2ndkauboy
fuente
1
Comparar con Java es una mala idea. Java tiene paquetes y hay clases de visibilidad de paquetes. La visibilidad de los miembros protegidos también depende del paquete al que acceda.
Artefacto
1
No son iguales a los paquetes pero comparten la misma idea.
2ndkauboy
Como la pregunta también pregunta qué espacios de nombres son en general, la respuesta tiene sentido.
kiamlaluno
@kiam Comparten una idea: nombres de clase sin conflicto. No comparten la idea de visibilidad.
Artefacto
@Artefacto: Kau-Boy no dijo que los espacios de nombres en ambos idiomas fueran iguales.
kiamlaluno
4

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 de un nombre de elemento simple sin causar una colisión de nombres en un programa. Es compatible con PHP 5.3.0, PHP 7.

Pero hay algunos límites en 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.


fuente
3

Un espacio de nombres funciona como un directorio. ¿Sabes cómo puedes poner archivos en un directorio con los mismos nombres que los archivos en el directorio principal (o cualquier otro)? Bueno, un espacio de nombres le permite hacerlo dentro de una aplicación para variables, funciones y clases.

Hubo un poco de tendencia en PHP hace un tiempo para grandes clases de funciones estáticas. La única forma de llamar a cualquiera de esas funciones era anteponiendo una llamada con el nombre de la clase. Este fue un intento primitivo de espacios de nombres, pero no con muchos de los beneficios.

staticsan
fuente
2

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 cuando las aplicaciones más grandes evitan problemas con piezas de código que comparten el mismo nombre.

Por ejemplo, supongamos que queríamos dos funciones llamadas "TheMessage". Ambos imprimirían (eco) diferentes mensajes cada uno. Normalmente, esto causaría un error de sintaxis, ya que no puede tener dos funciones que compartan el mismo nombre.

Para solucionar esto, puede colocar estas funciones en espacios de nombres separados. Esto le permitiría usar ambas funciones sin ningún error.

Alejandro
fuente
2

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 artículos del otro, decide etiquetar los cajones para que quede claro qué pertenece a quién.

Mamun Sabuj
fuente
0

El espacio de nombres se usa para incluir un grupo de códigos para que puedan usarse en diferentes lugares sin conflictos de nombres. Piense en esto como método jQuery sin conflicto y lo entenderá mejor.

Emmanuel David
fuente
¿Qué quiere decir con "método jQuery sin conflicto"? ¿Cómo se relaciona eso con PHP?
Nico Haase
0

Un espacio de nombres es un sistema simple para controlar los nombres en un programa.
Asegura que los nombres sean únicos y no generen ningún conflicto.

sirena
fuente
¿De qué tipo de "nombres" estás hablando?
Nico Haase
0

Puede usar el espacio de nombres para evitar colisiones de nombres entre el código que crea y las clases / funciones / constantes internas de PHP o clases / funciones / constantes de terceros. Los espacios de nombres también tienen la capacidad de alias (o acortar) Extra_Long_Names diseñados para reducir el primer problema, mejorando la legibilidad del código fuente.

Como todos sabemos, los espacios de nombres y rasgos no son nuevos en PHP, pero aún así muchos desarrolladores de php no usan estos grandes conceptos debido a su complejidad. Entonces, en esta publicación. Trataré de borrarlos con ejemplos. ¿Qué son los espacios de nombres y los rasgos?

¿Cómo puede implementarlos en su código para que su código sea reutilizable y extensible?

Beneficios de los espacios de nombres

Puede usar el espacio de nombres para evitar colisiones de nombres entre el código que crea y las clases / funciones / constantes internas de PHP o clases / funciones / constantes de terceros.

Los espacios de nombres también tienen la capacidad de alias (o acortar) Extra_Long_Names diseñados para reducir el primer problema, mejorando la legibilidad del código fuente. Comprendamos los espacios de nombres con un ejemplo. cree un nombre de carpeta "php_oops" en htdocs (xampp) o www (xwamp) cree una nueva carpeta en el directorio raíz llamada "namespaces", y luego cree un archivo index.php en la carpeta de espacios de nombres.

<?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

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

Ashwani Garg
fuente
1
Tenga cuidado al vincular su propio contenido en diferentes sitios, no desea ser un spammer . Debería incluir la mayoría del contenido aquí, y usar el enlace solo como referencia.
Dharman