php

Funciones con chequeo de tipos en PHP 7

Introducción

PHP es un lenguaje de programación que ha evolucionado. En la versión 7 se introdujeron las funciones de tipado fuerte, mismas que comprueban el tipo de las variables que reciben (parámetros) y regresan.

Veamos cómo se definen, cómo se llaman y por qué son una característica que hace al lenguaje mucho mejor.

Funciones normales

Primero veamos cómo se ha definido una función antes de la llegada de PHP 7.

Sabemos que PHP es de tipado débil así que definimos una función de esta forma:

#<?php
function decirHola($nombre){
    echo "¡Hola $nombre!";
}

Ahí no especificamos el tipo de dato que se regresa (tampoco indicamos si se regresa algo) ni el tipo de dato de la variable $nombre. Usando el lenguaje podemos inferir que el nombre es de tipo cadena, pero podríamos estar equivocados.

Por ejemplo, en una función en donde esperamos una cadena pueden pasarnos un número y el intérprete no se quejará. Veamos esta función que espera una palabra y regresa su primera letra:

#<?php
function primeraLetra($palabra){
  return $palabra[0]; 
}

La llamamos con la palabra “Hola”…

echo "La primera letra de Hola es: " . primeraLetra("Hola");

Y la salida es:

La primera letra de Hola es: H

Pero ahora la llamamos con un entero…

echo "La primera letra de 500 es: " . primeraLetra(500);

Cuya salida es:

La primera letra de 500 es:

Sí, la función no regresa nada. Ese es un comportamiento inesperado que puede traernos problemas.

Y yo sé, yo sé que podemos comprobar los tipos o castear, pero es una malísima práctica. Por otro lado, esto de las variables sí pasa, sobre todo cuando las sacamos de una base de datos, a veces los enteros se convierten en cadena.

Funciones de tipado fuerte en PHP

Estas funciones nos hacen ser más expresivos al definirlas. Además, si se llaman con datos incorrectos el intérprete se quejará o se generará un error, dependiendo de nuestra configuración. En el mejor de los casos el casteo se hará sin molestarnos.

Ahora veamos cómo se define una función en donde se comprueban los tipos de datos, escribiendo de nuevo la función de arriba. Queda así:

#<?php
function primeraLetra(string $palabra):string{
    return $palabra[0];
}

Ahí ya estamos indicando que recibimos una variable de tipo string, y que regresaremos igualmente un string. Cuando otro programador lea la definición de la función sabrá exactamente lo que dicha función hace.

Incluso si la llamamos con el número 500, PHP lo convertirá a cadena. Llamemos de nuevo a la función:

echo "La primera letra de 500 es: " . primeraLetra(500);

Ahora la salida sí es lo que esperamos:

La primera letra de 500 es: 5

Por cierto, no únicamente podemos pasar strings. También acepta el tipo de dato array, callable, bool, float e int. Más información aquí.

Chequeo de tipos de objetos

Esta nueva sintaxis permite incluso obligar a que nos pasen instancias de determinada clase. Veamos el siguiente ejemplo en donde necesitamos que nos pasen un objeto de tipo Mascota.

Declaramos la clase y algunos métodos:

#<?php
class Mascota{
    private $nombre;
    
    public function __construct(string $nombre){
        $this->nombre = $nombre;
    }
 
    public function getNombre():string{
        return $this->nombre;
    }
}

Ahora creamos una función que recibe un objeto de tipo Mascota:

#<?php
function llevarAlVeterinario(Mascota $mascota){
    echo "Llevamos a " . $mascota->getNombre() . " al veterinario ;)";
}

Si la intentamos llamar con cualquier cosa, por ejemplo un string, esto pasa:

PHP Fatal error: Uncaught TypeError: Argument 1 passed to llevarAlVeterinario() must be an instance of Mascota, string given

Dice que el primer argumento que le pasamos a la función llevarAlVeterinario debe ser una instancia de Mascota, pero le dimos una string. Si en cambio le mandamos una mascota:

#<?php
$m = new Mascota("Maggie");
llevarAlVeterinario($m);

La salida es:

Llevamos a Maggie al veterinario 😉

Conclusión

Así es como podemos incorporar el type hinting o chequeo de tipos en las funciones de PHP. Esto hace que las funciones y nuestro código en general sea más expresivo, seguro y libre de bugs.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Ver comentarios

  • Dios mío, ¡¿qué ven mis ojos?!

    En el fragmento de código que declaras la clase Mascota:
    Estás declarando una clase aplicando type hinting y a la vez declaras una propiedad utilizando la palabra reservada 'var' ?!?!?!?

    Uff me duelen los ojos...
    Me dejé esto: https://wiki.php.net/rfc/var_deprecation

    • Gracias por tus comentarios, ya he corregido lo que mencionas; realmente no sabía lo de la deprecación de var.
      Saludos

Entradas recientes

Creador de credenciales web – Aplicación gratuita

Hoy te voy a presentar un creador de credenciales que acabo de programar y que…

1 semana hace

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

2 semanas hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

2 semanas hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

2 semanas hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

2 semanas hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

2 semanas hace

Esta web usa cookies.