Espacios de Nombres (Namespaces) y la Instrucción use
Aprende a estructurar proyectos de gran escala con namespaces para prevenir colisiones de nombres entre clases y domina el uso de alias con as.
El Problema de la Colisión de Nombres
Imagina que en tu sistema creas una clase llamada Usuario. Luego, instalas una librería para autenticación con Google y esa librería también define una clase llamada Usuario.
Sin Namespaces, PHP colapsaría inmediatamente con un error irrecuperable:
Fatal error: Cannot declare class Usuario, because the name is already in use
Los Espacios de Nombres (Namespaces) funcionan exactamente igual que las carpetas en el disco duro de tu computadora: puedes tener dos archivos con el mismo nombre siempre y cuando estén guardados en carpetas diferentes.
Declaración e Importación de Namespaces
La instrucción namespace se coloca en la primerísima línea del archivo PHP:
<?php
declare(strict_types=1);
namespace Kilopolis\Modelos; // Espacio de nombres lógico
class Usuario {
// Nombre completo (FQCN): \Kilopolis\Modelos\Usuario
}
Importación Limpia con `use` y Resolución de Alias con `as`
Para no escribir $u = new \Kilopolis\Modelos\Usuario(); cada vez, usamos use en la cabecera:
use Kilopolis\Modelos\Usuario;
$u = new Usuario(); // Código limpio y legible
Y si dos librerías externas tienen el mismo nombre de clase, utilizamos as para crear un alias único:
use ProveedorA\PDFGenerator as FpdfEngine;
use ProveedorB\PDFGenerator as DompdfEngine;
⚡ Simulación de Dos Clases con Mismo Nombre en Diferentes Namespaces
Ejecuta el código en el Sandbox y observa cómo coexisten dos clases Factura en un mismo script:
<?php
declare(strict_types=1);
// ==========================================
// MÓDULO 1: Facturación Física (Tienda Local)
// ==========================================
namespace Kilopolis\TiendaFisica
{
class Factura
{
public function __construct(
private string $codigoTicket,
private float $total
) {}
public function imprimir(): string
{
return "🧾 Ticket Impreso Físico [{$this->codigoTicket}] - Total en caja: $" . number_format($this->total, 2);
}
}
}
// ==========================================
// MÓDULO 2: Facturación Digital (E-Commerce)
// ==========================================
namespace Kilopolis\TiendaDigital
{
class Factura
{
public function __construct(
private string $uuidFiscal,
private float $total
) {}
public function enviarXml(): string
{
return "📱 Factura Electrónica XML firmada [{$this->uuidFiscal}] enviada a la DIAN/Hacienda. Total: $" . number_format($this->total, 2);
}
}
}
// ==========================================
// CÓDIGO PRINCIPAL QUE CONSUME AMBOS MÓDULOS
// ==========================================
namespace
{
// Usamos alias 'as' para que no colisionen
use Kilopolis\TiendaFisica\Factura as FacturaFisica;
use Kilopolis\TiendaDigital\Factura as FacturaDigital;
$facturaSucursal = new FacturaFisica("TICKET-8492", 45.00);
$facturaWeb = new FacturaDigital("FE-9a8b-7c6d-5e4f", 189.99);
echo "<h2>Convivencia Pacífica de Clases con Namespaces:</h2>";
echo "<p style='color:#0284c7; font-family:system-ui;'>" . $facturaSucursal->imprimir() . "</p>";
echo "<p style='color:#10b981; font-family:system-ui;'>" . $facturaWeb->enviarXml() . "</p>";
}
Mini-Quiz de Retención
Comprueba tu comprensión antes de pasar a la siguiente lección¿Cuál es el propósito principal de los Namespaces en PHP?
¿Tienes dudas con este tema?
Sócrates AI puede darte analogías y explicarte este código paso a paso.🚀 ¿Quieres dominar Manual de Programación Orientada a Objetos en PHP (POO) y crear proyectos reales?
Aprende arquitectura limpia, desarrollo web moderno, buenas prácticas y despliegue en producción con nuestro Bootcamp Fullstack Developer con mentorías en vivo.
🏛️ Autoría y Propiedad Intelectual: Obra educativa original de David Amador para Kilopolis Academia (Solucionáticos), estructurada sobre las especificaciones y estándares abiertos del W3C, el estándar vivo de WHATWG y la documentación oficial de código abierto. © Todos los derechos reservados.