¿Qué son los espacios de nombres PHP?
¿Qué son los espacios de nombres en general?
Una respuesta laica con un ejemplo sería genial.
fuente
¿Qué son los espacios de nombres PHP?
¿Qué son los espacios de nombres en general?
Una respuesta laica con un ejemplo sería genial.
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.
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.
¿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();
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.
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.
Puede encontrar mucha más información en la documentación oficial de PHP para espacios de nombres .
fuente
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 dondenamespace
resulta útil y lause
palabra 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\Controllers
así 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
use
palabra clave " ", usamos, lause
palabra clave " " para que nuestra clase conozca una clase o función específica que queremos usar en nuestra claseasí 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
", lause
palabra 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
as
palabra clave " " junto con lause
palabra 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
".fuente
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 ):
fuente
Al igual que los directorios y archivos , el espacio de nombres en PHP sirve para agrupar clases , funciones , interfaces y constantes .
Ejemplo:
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:
El principio se extiende al espacio de nombres en la palabra de programación.
fuente
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.
fuente
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.
fuente
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.
fuente
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.
fuente
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.
fuente
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.
Referencia: https://medium.com/@akgarg007/php-laravel-namespaces-and-traits-01-9540fe2969cb
fuente