Un namespace es un espacio de nombres que organiza clases, interfaces y funciones y evita colisiones entre ellas.
A medida que tu proyecto crece, o cuando empiezas a usar librerías de terceros con Composer, surge un problema grave: El conflicto de nombres.
Imagina que creas una clase llamada Usuario. Luego instalas una librería de autenticación que también tiene una clase llamada Usuario.
¿Qué hace PHP? Error Fatal. No puede haber dos clases con el mismo nombre.
Los Namespaces (Espacios de Nombres) solucionan esto. Funcionan igual que las carpetas en tu sistema operativo: puedes tener fotos/archivo.txt y trabajo/archivo.txt. Se llaman igual, pero viven en “directorios virtuales” distintos.
Definir un namespace
Para meter tu código dentro de una “carpeta virtual”, usas la palabra clave namespace en la primera línea de tu archivo PHP (después de <?php).
Archivo: MiProyecto/Modelos/Usuario.php
<?php
namespace MiProyecto\Modelos;
class Usuario {
public function saludar() {
return "Soy el usuario de TU proyecto.";
}
}Ahora, el nombre real y completo de esa clase ya no es Usuario. Es:
\MiProyecto\Modelos\Usuario
Importar con use
Si quieres usar esa clase en otro archivo, tienes dos opciones:
Opción A: La ruta completa (Incómoda) Tienes que escribir el “nombre y apellidos” cada vez.
$user = new \MiProyecto\Modelos\Usuario();Opción B: Importar con use (Profesional)
Al principio del archivo, indicas qué clases vas a usar. Así luego solo escribes el nombre corto.
<?php
// Importamos la clase una sola vez
use MiProyecto\Modelos\Usuario;
// Ahora la usamos como si estuviera aquí mismo
$user = new Usuario();
echo $user->saludar();Resolviendo conflictos (alias)
¿Qué pasa si necesitas usar DOS clases que se llaman igual (ej: tu Usuario y el Usuario de una librería)? Usamos as para darle un apodo.
<?php
use MiProyecto\Modelos\Usuario as MiUsuario;
use LibreriaExterna\Auth\Usuario as AuthUsuario;
$yo = new MiUsuario(); // Instancia tu clase
$el = new AuthUsuario(); // Instancia la libreríaLa “raíz” global (\)
Cuando estás dentro de un namespace (ej: namespace MiApp;), PHP asume que todo lo que llamas pertenece a ese namespace.
Si intentas usar una clase nativa de PHP (como DateTime, Exception o PDO) y no le pones la barra invertida delante, PHP buscará \MiApp\DateTime y fallará.
Para acceder a las clases globales de PHP desde dentro de un namespace, anteponemos \:
namespace MiApp\Controladores;
class Reporte {
public function crear() {
// MAL: Buscará \MiApp\Controladores\DateTime
// $fecha = new DateTime();
// BIEN: La barra inicial indica "busca en la raíz global de PHP"
$fecha = new \DateTime();
}
}