Introducción a los Namespaces
Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy. Lección 10 de 91.
A medida que tus proyectos de PHP crecen, crearás muchas clases. ¿Qué sucede cuando dos clases tienen el mismo nombre?
Por ejemplo, podrías tener una clase User para tu blog y otra clase User para tu tienda. Los espacios de nombres resuelven este problema organizando las clases en grupos lógicos.
Un espacio de nombres es como una carpeta para tus clases. Lo declaras en la parte superior de tu archivo PHP usando la palabra clave namespace:
<?php
namespace Blog;
class User {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
Ahora puedes tener otra clase User en un espacio de nombres diferente:
<?php
namespace Shop;
class User {
public $email;
public function __construct($email) {
$this->email = $email;
}
}
Para usar una clase con espacio de nombres, haces referencia a ella con su ruta completa usando una barra inversa:
<?php
$blogUser = new \Blog\User("Alice");
$shopUser = new \Shop\User("alice@example.com");
echo $blogUser->name . "\n";
echo $shopUser->email . "\n";
Salida:
REQUIRED OUTPUT FORMAT:Alice
alice@example.com
La barra invertida \ separa los niveles del espacio de nombres, de forma similar a como las barras separan las carpetas en una ruta de archivo. También puedes crear espacios de nombres anidados como App\Models\Blog para una organización más profunda.
Punto clave: Los espacios de nombres evitan conflictos de nombres y mantienen tu código organizado. Declara siempre el espacio de nombres antes de cualquier otro código en tu archivo (excepto las declaraciones declare).
Desafío
FácilOrganicemos una pequeña aplicación usando espacios de nombres para evitar conflictos de nombres entre clases con el mismo nombre.
Imagina que estás creando un sistema que gestiona tanto vehículos como animales. Ambos dominios tienen una entidad llamada Car: una representa un automóvil real, mientras que la otra es una gata mascota llamada "Car" (¡sí, algunas personas llaman así a sus gatos!).
Crearás tres archivos:
Vehicle/Car.php: Define una claseCaren el espacio de nombresVehiclecon una propiedadpublic $brand. El constructor debe aceptar el nombre de la marca y asignarlo. Añade un métododescribe()que devuelva"Vehicle: [brand]".Animal/Car.php: Define una claseCaren el espacio de nombresAnimal(¡es una gata llamada Car!). Debe tener una propiedadpublic $age. El constructor acepta la edad y la asigna. Añade un métododescribe()que devuelva"Cat named Car, age: [age]".main.php: Incluye ambos archivos de clase usandorequire_once. Crea un objeto de cada espacio de nombres usando sus rutas completas de espacio de nombres y luego imprime el resultado de llamar adescribe()en cada objeto (cada uno en su propia línea).
En main.php, crea:
- Un
Vehicle\Carcon la marca"Toyota" - Un
Animal\Carcon la edad3
Recuerda usar la barra inversa \ para hacer referencia a clases con espacios de nombres mediante su ruta completa al crear objetos.
Pruébalo tú mismo
<?php
// Incluye los archivos de clase
require_once 'Vehicle/Car.php';
require_once 'Animal/Car.php';
// TODO: Crea un objeto Vehicle\Car con la marca "Toyota"
// Recuerda usar la ruta completa del namespace con barra invertida
// TODO: Crea un objeto Animal\Car con edad 3
// Recuerda usar la ruta completa del namespace con barra invertida
// TODO: Imprime el resultado de describe() para cada objeto (cada uno en su propia línea)
?>Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de la POO
Archivos externosIntroducción a la POOClases frente a objetosLa palabra clave $thisMétodosPropiedadesConstructor (__construct)Destructor (__destruct)Repaso: calculadora simple4Herencia
Herencia básicaLa palabra clave parent::Sobrescritura de métodosLa palabra clave finalClases abstractasRepaso - Jerarquía de empleados7Encapsulación
Público, protegido, privadoModificadores de acceso en profundidadGetters y settersOcultación de la informaciónPromoción del constructor (8.0)Repaso: sistema de registros de estudiantes10Conceptos avanzados de OOP
Composición vs. herenciaInyección de dependenciasClases anónimasEnums (PHP 8.1)Fibras (PHP 8.1)Análisis profundo de la clonación de objetosGeneradores e iteradores13Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Repository2Namespaces y carga automática
Introducción a los NamespacesLa palabra clave useEstándar de carga automática PSR-4Autoloader de ComposerRepaso: proyecto organizado5Interfaces y contratos
Introducción a las interfacesImplementación de interfacesImplementación de múltiples interfacesInterfaces vs. clase abstractaTipado con interfacesRepaso - Calculadora de formas8Métodos mágicos
Introducción a los métodos mágicos__toString y __debugInfo__get, __set, __isset, __unset__call y __callStatic__clone y clonación de objetos__serialize y __unserializeRepaso: colección personalizada3Propiedades de clase
Propiedades de instancia vs. estáticasConstantes en clasesMétodos y propiedades estáticosPropiedades privadas y protegidasPropiedades de solo lectura (PHP 8.1)Repaso: gestor de cuentas bancarias6Polimorfismo
Repaso de la sobrescritura de métodosPolimorfismo mediante interfacesAnotaciones de tipo y tipos uniónEnlace estático tardíoRepaso: procesador de pagos9Traits
Introducción a los TraitsUso de múltiples TraitsResolución de conflictos entre TraitsMétodos abstractos en TraitsTraits frente a la herencia12Patrones de diseño, parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón StrategyPractica por tu cuenta: Compilador de PHP online