php-tipos-de-datos-y-tipado-estricto-en-php

Tipos de datos y tipado estricto en PHP

  • 4 min

Un tipo de dato es la categoría que determina qué valores puede contener un dato y qué operaciones admite.

Antiguamente, PHP era el “Salvaje Oeste” de los tipos. Podías sumar una manzana con una pera y el lenguaje intentaba darte un resultado en lugar de un error.

PHP conserva el tipado dinámico, pero permite declarar tipos en parámetros, retornos y propiedades. Esto nos deja expresar con claridad qué datos esperamos recibir y qué vamos a devolver.

Esto no es pedantería académica; es la diferencia entre una aplicación que falla silenciosamente y una que te avisa antes de que cometas el error.

Los tipos escalares

Los tipos escalares son los ladrillos básicos de la información. En PHP tenemos cuatro principales:

  • int: Números enteros (Ej: 42, -10).
  • float: Números decimales o de punto flotante (Ej: 3.14, 1.5).
  • string: Cadenas de texto (Ej: "Hola mundo").
  • bool: Valor de verdad (true o false).

A estos se suman otros tipos especiales como null (ausencia de valor), array (listas), object (clases) y void (cuando una función no devuelve nada).

Type hinting

El Type Hinting es la forma de decirle a PHP: “Esta función necesita un número entero, no me des otra cosa”.

Podemos tipar tanto los argumentos (entrada) como el retorno (salida).

// Sin Type Hinting (El estilo antiguo)
function sumar($a, $b) {
    return $a + $b;
}
// ¿Qué pasa si hago sumar("hola", [1,2])? ¡Caos!

// Con Type Hinting (El estilo moderno)
function sumar(int $a, int $b): int {
    return $a + $b;
}
Copied!

Fíjate en la sintaxis:

  1. Ponemos el tipo delante de la variable: int $a.
  2. Ponemos el tipo de retorno después de los dos puntos: : int.

Ahora el código se documenta solo. Si lees la función, sabes exactamente qué necesita para funcionar.

El problema de la “coerción” (tipado débil)

Por defecto, PHP sigue siendo “amable”. Si tienes una función que espera un int y le pasas el texto "5", PHP dirá: “Bueno, parece un número, lo convertiré en un 5 y seguiré adelante”.

A esto se le llama Coerción de Tipos.

Aunque a veces resulta útil, puede ocultar errores. Una cadena numérica como "5" puede convertirse en entero en modo coercitivo, mientras que un texto no numérico como "5 manzanas" provoca un TypeError al pasarlo a un parámetro int.

Activar declare(strict_types=1);

Para activar el modo riguroso de PHP, debemos añadir una instrucción especial en la primera línea del archivo, antes de cualquier otra cosa.

<?php
declare(strict_types=1);

function sumar(int $a, int $b): int {
    return $a + $b;
}

// Escenario 1: Correcto
echo sumar(2, 3); // Salida: 5

// Escenario 2: Error Fatal
echo sumar(2, "3"); 
// Error: Argument #2 must be of type int, string given
Copied!

Al activar strict_types=1, PHP deja de convertir automáticamente los tipos escalares en las llamadas realizadas desde ese archivo. Si la función pide un entero y le das un string, lanzará un TypeError. Esta directiva no cambia el tipado dinámico de las variables ni se aplica del mismo modo a todas las funciones internas de PHP.

¿Por qué usarlo siempre?

Es mejor que el programa falle en tu ordenador mientras desarrollas (y lo corrijas al momento), a que falle en producción con datos corruptos porque PHP intentó “adivinar” el tipo de dato incorrectamente.

Union types (tipos de unión)

A veces, la vida no es blanca o negra. A veces una variable puede ser o una cosa o otra. Desde PHP 8, podemos expresarlo con la barra vertical |.

Imagina que buscas un producto por ID. Ese ID podría ser un número (150) o un código ("PROD-150").

function buscarProducto(int|string $id): void {
    // Lógica para buscar...
    echo "Buscando producto: " . $id;
}
Copied!

Esto es muy potente porque mantenemos el control (sabemos que será int o string) sin perder flexibilidad.

El tipo mixed

Existe un tipo llamado mixed que significa “acepta cualquier cosa”.

  • Consejo: Úsalo solo cuando no tengas más remedio. Si usas mixed para todo, estás volviendo al PHP antiguo y perdiendo las ventajas del tipado.