La característica de proporcionar sugerencias de tipo ha estado en PHP desde la versión 5. La sugerencia de tipo se refiere a la práctica de proporcionar el tipo de datos de un parámetro en la definición de la función. Antes de PHP 7, era posible usar solo el array, el invocable y la clase para las sugerencias de tipo en una función. A partir de PHP 7, también puede insertar sugerencias de tipo para parámetros de tipo de datos escalares como int, string, bool, etc.

PHP es un lenguaje de tipado dinámico (y débil). Por lo tanto, no es necesario declarar el tipo del parámetro cuando se define una función, algo que es necesario en un lenguaje de tipos estáticos como C o Java.

Una definición típica de función en PHP es la siguiente:

function addition($x, $y) {
   echo "First number: $x Second number: $y Addition: " . $x+$y;
}

Aquí, asumimos que los parámetros $x y $y son numéricos. Sin embargo, incluso si los valores pasados a la función no son numéricos, el analizador PHP intenta convertir las variables en un tipo compatible en la medida de lo posible.

Si uno de los valores pasados es una representación de cadena de un número, y el segundo es una variable numérica, PHP convierte la variable de cadena a numérica para realizar la operación de suma.

Ejemplo

Echa un vistazo al siguiente ejemplo:

<?php
   function addition($x, $y) {
      echo "First number: " . $x; 
      echo "\nSecond number: " . $y; 
      echo "\nAddition: " . $x+$y;
   }

   $x="10";
   $y=20;
   addition($x, $y);
?>

Producirá el siguiente resultado:

First number: 10
Second number: 20
Addition: 30

Sin embargo, si $x en el ejemplo anterior es una cadena que no contiene una representación numérica válida, se produce un error.

<?php
   function addition($x, $y) {
      echo "First number: " . $x; 
      echo "\nSecond number: " . $y; 
      echo "\nAddition: " . $x+$y;
   }

   $x="Hello";
   $y=20;
   addition($x, $y);
?>

Ejecute este código y vea cómo muestra un error.

Declaraciones de tipos escalares en PHP 7

Una nueva característica introducida con la versión 7 de PHP permite definir una función con parámetros cuyo tipo de datos se puede especificar entre paréntesis.

PHP 7 ha introducido las siguientes declaraciones de tipo escalar:

  • Int
  • Float
  • Bool
  • String
  • Interfaces
  • Array
  • Callable

Las versiones anteriores de PHP permitían que solo se usaran los tipos de matriz, invocable y clase como sugerencias de tipo. Además, en las versiones anteriores de PHP (PHP 5), el error fatal solía ser un error recuperable, mientras que la nueva versión (PHP 7) devuelve un error lanzable.

La declaración de tipo escalar se implementa de dos modos:

  • Coercive Mode: Coercive es el modo predeterminado y no es necesario especificarlo.
  • Strict Mode: Strict moded debe insinuarse explícitamente.

Coercive Mode

La función addition() definida en el ejemplo anterior ahora se puede volver a escribir incorporando las declaraciones de tipo de la siguiente manera:

function addition(int $x, int $y) {
   echo "First number: $x Second number: $y Addition: " . $x+$y;
}

Tenga en cuenta que el analizador sigue convirtiendo los tipos incompatibles, es decir, una cadena en un int si la cadena contiene un entero como antes.

Ejemplo

Echa un vistazo al siguiente ejemplo:

<?php
   function addition(int $x, int $y) {
      echo "First number: " . $x;
      echo "\nSecond number: " . $y;
      echo "\nAddition: " . $x+$y;
   }

   $x="10";
   $y=20;
   echo addition($x, $y);
?>

Producirá el siguiente resultado:

First number: 10
Second number: 20
Addition: 30

Obviamente, esto se debe a que PHP es un lenguaje de tipos débiles, ya que PHP intenta forzar una variable de tipo cadena a un número entero. PHP 7 ha introducido una característica de modo estricto que soluciona este problema.

Strict Mode

Para contrarrestar la comprobación de tipos débiles de PHP, se ha introducido un modo estricto. Este modo se habilita con una declaración de instrucción:

declare(strict_types=1);

Debes poner esta declaración en la parte superior del script PHP (normalmente justo debajo de la etiqueta PHP). Esto significa que la rigurosidad de la escritura para escalares se configura por archivo.

En el modo débil, el indicador strict_types es 0. Establecerlo en 1 obliga al analizador PHP a comprobar la compatibilidad de los parámetros y valores pasados. Agregue esta instrucción en el código anterior y verifique el resultado. Mostrará el siguiente mensaje de error:

Fatal error: Uncaught TypeError:addition():Argument#1 ($x) must be of type int, string given, 
called in add.php on line 12and defined in add.php:4

Stack trace:#0 add.php(12): addition('10', 20)#1 {main}
   thrown in add.php on line 4

Ejemplo

Este es otro ejemplo de declaración de tipo escalar en la definición de la función. El modo estricto, cuando está habilitado, genera un error irrecuperable si los tipos incompatibles se pasan como parámetros.

<?php

   // Strict mode
   // declare(strict_types = 1);
   function sum(int ...$ints) {
      return array_sum($ints);
   }

   print(sum(2, '3', 4.1));
?>

Quite la marca de comentario de la instrucción declare en la parte superior de este código y ejecútela. Ahora producirá un error:

Fatal error: Uncaught TypeError: 
sum(): Argument #2 must be of type int, string given, 
called in add.php on line 9 and defined in add.php:4
Stack trace:
#0 add.php(9): sum(2, '3', 4.1)
#1 {main}
   thrown in add.php on line 4

Los IDE utilizan principalmente la función de sugerencia de tipos para preguntar al usuario sobre los tipos esperados de los parámetros utilizados en la declaración de función. En la captura de pantalla siguiente se muestra el editor de VS Code que muestra el prototipo de función a medida que escribe.