Introducción a los espacios de nombres
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, se hace referencia a ella con su ruta completa usando una barra invertida:
<?php
$blogUser = new \Blog\User("Alice");
$shopUser = new \Shop\User("alice@example.com");
echo $blogUser->name . "\n";
echo $shopUser->email . "\n";
Salida:
Alice
alice@example.com
La barra invertida \ separa los niveles de los espacios de nombres, de manera similar a cómo 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 su código organizado. Declare siempre el espacio de nombres antes de cualquier otro código en su archivo (excepto por las sentencias declare).
Desafío
FácilVamos a organizar una pequeña aplicación utilizando espacios de nombres (namespaces) para evitar conflictos de nombres entre clases con el mismo nombre.
Imagina que estás construyendo un sistema que maneja tanto vehículos como animales. Ambos dominios tienen una entidad llamada Car — una representa un automóvil real, mientras que la otra es un gato mascota llamado "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 establecerlo. Añade un métododescribe()que devuelva"Vehicle: [brand]".Animal/Car.php— Define una claseCaren el espacio de nombresAnimal(¡este es un gato llamado Car!). Debe tener una propiedadpublic $age. El constructor acepta la edad y la establece. 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 utilizando sus rutas completas de espacio de nombres, 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 invertida \ para referenciar clases con espacios de nombres con su ruta completa al crear objetos.
Hoja de referencia
Los espacios de nombres organizan las clases en grupos lógicos y evitan conflictos de nombres cuando varias clases comparten el mismo nombre.
Declare un espacio de nombres en la parte superior de un archivo PHP utilizando la palabra clave namespace:
<?php
namespace Blog;
class User {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
Puede tener clases con el mismo nombre en diferentes espacios de nombres:
<?php
namespace Shop;
class User {
public $email;
public function __construct($email) {
$this->email = $email;
}
}
Para utilizar una clase con espacio de nombres, hágale referencia con su ruta completa utilizando una barra invertida \:
<?php
$blogUser = new \Blog\User("Alice");
$shopUser = new \Shop\User("alice@example.com");
echo $blogUser->name . "\n";
echo $shopUser->email . "\n";
La barra invertida separa los niveles de los espacios de nombres, de forma similar a las rutas de las carpetas. Puede crear espacios de nombres anidados como App\Models\Blog.
Importante: Declare siempre el espacio de nombres antes de cualquier otro código en su archivo (excepto las sentencias declare).
Pruébalo tú mismo
<?php
// Incluir los archivos de clase
require_once 'Vehicle/Car.php';
require_once 'Animal/Car.php';
// TODO: Crear un objeto Vehicle\Car con la marca "Toyota"
// Recuerda usar la ruta completa del espacio de nombres con barra invertida
// TODO: Crear un objeto Animal\Car con la edad 3
// Recuerda usar la ruta completa del espacio de nombres con barra invertida
// TODO: Imprimir 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 OOP
Archivos externosIntroducción a OOPClases vs ObjetosLa palabra clave $thisMétodosPropiedadesConstructor (__construct)Destructor (__destruct)Resumen - Calculadora simple4Herencia
Herencia básicaLa palabra clave parent::Sobrescritura de métodosLa palabra clave finalClases abstractasResumen - Jerarquía de empleados7Encapsulamiento
Público, Protegido, PrivadoModificadores de acceso a fondoGetters y SettersOcultamiento de informaciónPromoción de constructor (8.0)Resumen - Sistema de registros de estudiantes10Conceptos avanzados de POO
Composición vs. HerenciaInyección de dependenciasClases anónimasEnums (PHP 8.1)Fibers (PHP 8.1)Clonación de objetos a fondoGeneradores e Iteradores13Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Repository2Espacios de nombres y Autoloading
Introducción a los espacios de nombresLa palabra clave useEstándar de Autoloading PSR-4Autoloader de ComposerResumen - Proyecto organizado5Interfaces y Contratos
Introducción a las InterfacesImplementación de InterfacesImplementación de Múltiples InterfacesInterfaz vs Clase AbstractaType Hinting con InterfacesResumen - 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 __unserializeResumen - 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)Resumen - Gestor de cuenta bancaria6Polimorfismo
Sobrescritura de métodos revisadaPolimorfismo mediante interfacesType Hinting y tipos de uniónEnlace estático tardíoResumen - Procesador de pagos9Traits
Introducción a los TraitsUso de múltiples TraitsResolución de conflictos de TraitsMétodos abstractos en TraitsTraits frente a herencia12Patrones de diseño Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón Strategy