Generics en PHP: para qué sirven y cómo usarlos en la práctica

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: qué son los Generics y por qué son importantes en PHP



El desarrollo moderno en PHP requiere cada vez más un tipado estricto y código reutilizable. Una de las herramientas clave para lograr estos objetivos son los Generics (genéricos). En PHP, el soporte para Generics se agregó oficialmente a partir de la versión PHP 8.0, aunque anteriormente existían varias utilidades y anotaciones (por ejemplo, a través de PHPDoc).



En este artículo, analizaremos para qué sirven los Generics en PHP, cómo funcionan en la práctica y proporcionaremos ejemplos de código concretos que le ayudarán a escribir código más seguro, legible y escalable.



¿Para qué sirven los Generics en PHP?



El objetivo principal de los Generics es garantizar la seguridad de tipos en tiempo de ejecución sin perder la flexibilidad del código genérico. Imagine que escribe una función para trabajar con una colección de elementos. Sin Generics, o usa tipos mixtos (mixed) o escribe funciones separadas para cada tipo de dato. Ambos enfoques generan errores y duplicación de código.



Estas son las principales ventajas de usar Generics:



  • Seguridad de tipos: los errores de tipo se detectan en tiempo de compilación, no en tiempo de ejecución.
  • Reutilización de código: una sola función o clase funciona con cualquier tipo de dato.
  • Legibilidad: el código se autodocumenta: se ve inmediatamente qué tipos se aceptan y devuelven.
  • Integración con IDE: los editores modernos (PhpStorm, VS Code) entienden mejor el código con Generics, ofreciendo autocompletado y sugerencias.


Cómo funcionan los Generics en PHP: sintaxis y construcciones principales



En PHP, los Generics se implementan mediante plantillas de tipos, que se definen entre corchetes angulares <T>. La letra T es una designación condicional del tipo que se sustituirá al llamar a la función o crear el objeto. Puede usar cualquier nombre: T, K, V o nombres descriptivos.



1. Funciones genéricas



Consideremos un ejemplo simple: una función que devuelve el primer elemento de un array:



<?php

function firstElement(array $items): mixed { return $items[0] ?? null;}

// Uso$numbers = [1, 2, 3];$first = firstElement($numbers); // tipo mixed, el IDE no sabe que es int


Con Generics, podemos especificar que la función trabaja con un array de elementos de cualquier tipo, pero devuelve exactamente el tipo que se pasó:



<?php

/** * @template T * @param array<T> $items * @return T|null */function firstElement(array $items): mixed { return $items[0] ?? null;}

// Ahora el IDE entiende que $first es int|null$first = firstElement([1, 2, 3]);


Tenga en cuenta: en PHP 8.0+, los Generics se admiten mediante anotaciones PHPDoc. El soporte nativo (sin comentarios) aún no está disponible, pero este es el estándar de facto para proyectos modernos.



2. Clases genéricas



El escenario más común para usar Generics son las clases de colección. Creemos una clase simple Collection que pueda almacenar elementos de cualquier tipo:



<?php

/** * @template T */class Collection { /** @var array<T> */ private array $items = [];

/** * @param T $item * @return void */ public function add(mixed $item): void { $this->items[] = $item; }

/** * @return T|null */ public function get(int $index): mixed { return $this->items[$index] ?? null; }

/** * @return array<T> */ public function all(): array { return $this->items; }}

// Uso$intCollection = new Collection<int>();$intCollection->add(10);$intCollection->add(

Blogs

Book Recommendations