Skip to content

UD 3 POO en el lenguaje PHP. Namespaces y Autoload

Desarrolla aplicaciones web identificando y aplicando mecanismos para separar el código de presentación de la lógica de negocio.

  • A Se han analizado y utilizado mecanismos y frameworks que permiten realizar esta separación y sus características principales.

1731387798106

Espacios de Nombres en PHP

En PHP, los namespaces (o espacios de nombres) son una forma de organizar el código y evitar conflictos entre nombres de clases, funciones o constantes cuando tienes múltiples archivos o bibliotecas que podrían usar nombres similares.

  • Los namespaces son especialmente útiles en proyectos grandes o cuando usas varias bibliotecas en una misma aplicación.
  • Se declaran en la primera línea mediante la palabra clave namespace seguida del nombre del espacio de nombres asignado (cada subnivel se separa con la barra invertida ):<?php

1731388053282

Uso de Namespaces en PHP

Vamos a crear un ejemplo de aplicación que gestione diferentes tipos de usuarios: Admin y Guest.

Estos estarán en su propio namespace dentro de una carpeta llamada Users.

Estructura de Archivos

Organizaremos el proyecto de la siguiente manera:

/project-root
    /Users
        Admin.php
        Guest.php
    main.php

1: Crear Clases con Namespaces

  1. Definir la clase Admin en el archivo Users/Admin.php:
<?php
namespace Users;

class Admin {
    public function getRole() {
        return "Administrador";
    }
}

En este archivo, definimos la clase Admin dentro del namespace Users. Ahora, para acceder a esta clase, necesitaremos usar Users\Admin en lugar de solo Admin. 2. Definir la clase Guest en el archivo Users/Guest.php:

<?php
namespace Users;

class Guest {
    public function getRole() {
        return "Invitado";
    }
}

Similar a Admin, aquí definimos la clase Guest dentro del mismo namespace Users.

2: Usar las Clases con Namespaces en el Archivo Principal

En main.php, usaremos estas clases importándolas mediante use.

<?php
require_once 'Users/Admin.php';
require_once 'Users/Guest.php';

use Users\Admin;
use Users\Guest;

$admin = new Admin();
echo "Rol del usuario: " . $admin->getRole(); // Output: Rol del usuario: Administrador

$guest = new Guest();
echo "\nRol del usuario: " . $guest->getRole(); // Output: Rol del usuario: Invitado
  1. En main.php, usamos require_once para incluir las clases Admin y Guest. Esto se hace para tener acceso a sus definiciones.
  2. La declaración use Users\Admin; y use Users\Guest; permite que PHP sepa que queremos utilizar las clases Admin y Guest dentro del namespace Users.
  3. Ahora, podemos crear instancias de Admin y Guest directamente con new Admin() y new Guest() sin necesidad de anteponer el namespace cada vez, gracias a use.

Ejemplo sin use

Alternativamente, podríamos omitir el use y llamar a las clases con el namespace completo:

<?php
require_once 'Users/Admin.php';
require_once 'Users/Guest.php';

$admin = new \Users\Admin();
echo "Rol del usuario: " . $admin->getRole();

$guest = new \Users\Guest();
echo "\nRol del usuario: " . $guest->getRole();

Beneficios de Usar Namespaces

  • Organización: Mantienes tu código bien organizado, especialmente en proyectos grandes.
  • Evitar conflictos: Previene conflictos de nombres, lo que es útil cuando usas varias bibliotecas que pueden tener clases con nombres similares.
  • Mejora de legibilidad: Los namespaces clarifican a qué módulo o componente pertenece cada clase.

Los namespaces en PHP permiten organizar y encapsular código para evitar conflictos y hacer que el código sea más mantenible y fácil de entender, especialmente en aplicaciones con muchas clases y funciones.

STL

La librería estándar de PHP (Standard PHP Library, SPL) es un conjunto de clases e interfaces integradas que proporciona funcionalidades comunes y utilidades para facilitar tareas comunes en PHP, como manipulación de datos, estructuras de datos (pilas, colas, listas), iteradores, excepciones, funciones para manejo de archivos, entre otras. SPL es parte nativa de PHP y no requiere instalación adicional, ofreciendo herramientas muy útiles para trabajar con algoritmos y estructuras de datos.

Uno de los componentes comunes de SPL es la clase SplStack, que permite manejar una pila (estructura de datos en la que los elementos se apilan y se desapilan en orden inverso, LIFO: Last In, First Out).

<?php
// Crear una nueva pila
$stack = new SplStack();

// Añadir elementos a la pila
$stack->push("Primer elemento");
$stack->push("Segundo elemento");
$stack->push("Tercer elemento");

// Desapilar elementos (se eliminarán en orden inverso)
echo $stack->pop(); // Output: Tercer elemento
echo "\n";
echo $stack->pop(); // Output: Segundo elemento
echo "\n";
echo $stack->pop(); // Output: Primer elemento
  • SplStack se usa para crear una pila.
  • push() añade elementos a la pila.
  • pop() elimina y devuelve el último elemento añadido a la pila.

SPL facilita el uso de estructuras como pilas, colas, listas, y muchos otros patrones de uso común en programación, sin tener que implementarlos manualmente.

1731388537452

Autoload

El autoload en PHP permite cargar automáticamente las clases cuando se necesitan, sin tener que hacer require o include manualmente cada vez que se utiliza una clase. Esto facilita la organización y escalabilidad del código, especialmente en aplicaciones grandes.

1731388537452

Implementación de Autoload en PHP

La función spl_autoload_register() es la forma recomendada en PHP para registrar una función de autoload. Esta función se encargará de incluir el archivo que contiene la clase cuando se intenta instanciar esa clase.

Ejemplo de Autoload

Imaginemos que tenemos una aplicación con varias clases organizadas en archivos separados en una carpeta classes.

Estructura de Archivos

/project-root
    /classes
        User.php
        Product.php
    index.php

1: Crear las Clases

  1. Archivo classes/User.php:

<?php
class User {
    public function __construct() {
        echo "Clase User cargada.\n";
    }
}
2. Archivo classes/Product.php:

<?php
class Product {
    public function __construct() {
        echo "Clase Product cargada.\n";
    }
}

2: Configurar Autoload en index.php

<?php
// Registrar la función de autoload
spl_autoload_register(function ($className) {
    include 'classes/' . $className . '.php';
});

// Instanciar las clases
$user = new User();    // Output: Clase User cargada.
$product = new Product(); // Output: Clase Product cargada.
  1. La función spl_autoload_register() recibe una función anónima que se ejecuta automáticamente cuando PHP encuentra una clase que no ha sido incluida.
  2. Esta función toma el nombre de la clase ($className), construye la ruta al archivo (classes/$className.php), e incluye ese archivo.
  3. Al instanciar new User() y new Product(), el autoload busca automáticamente los archivos User.php y Product.php en la carpeta classes, los carga, e imprime los mensajes definidos en sus constructores.

Nota

Nota

Este método de autoload es básico. En proyectos grandes, es recomendable usar estándares comoPSR-4 junto con Composer para gestionar el autoload de manera más estructurada.

FUNCIONA siempre que los nombres de los archivos se llamen como las clases.

El autoloading simplifica el mantenimiento y la organización de proyectos PHP, ya que reduce la necesidad de incluir manualmente cada archivo de clase en la aplicación.

Referencia en PHP Manual

Autoload en PHP 8 Tutors Code Free

Actividad Entregable

Entregable

Tienes la info en la sección "Actividad entregable"

Referencias

PHP Documentation

PHP The Right Way