PHP definición de tipos de parámetros

Definición de tipos de parámetros proporcionados en funciones o métodos.

Una de las novedades que trae PHP en su versión 7 es la extensión de la definición de tipos de parámetros, esta opción que se agrego escasamente en la versión 5.1 permitía únicamente definir arrays y objetos como tipos de parámetros.

<?php
$values
= function (array $vars) {
 
var_dump ( $vars );
}
$vars = array('one', 'two', 'tree');
print
$values($vars);
?>



Este código nos devuelve:

array(3) {
  [0]=>
  string(3) "one"
  [1]=>
  string(3) "two"
  [2]=>
  string(4) "tree"
}



Si en vez de un array pasamos una variable que no sea array nos devuelve:

PHP Catchable fatal error:  Argument 1 passed to {closure}() must be an array, string given, called in /home/vagrant/pruebas/types.php on line 12 and defined in /home/vagrant/pruebas/types.php on line 3

Catchable fatal error: Argument 1 passed to {closure}() must be an array, string given, called in /home/vagrant/pruebas/types.php on line 12 and defined in /home/vagrant/pruebas/types.php on line 3



En la versión 5.4 de PHP se añadió la posibilidad de definir parametros como funciones de retorno (callbacks) o se puede definir también el tipo de objeto como parámetro.

<?php
$func
= function($valor) {
    return
$valor * 2;
};
print_r(array_map($func, range(1, 5)));
?>



Un ejemplo de parámetro definido como un tipo concreto de clase:

<?php
// Un ejemplo de método de llamada de retorno
 
class MiClase {
     static function
miMetodoDeLlamadaDeRetorno() {
         echo (
'¡Hola Mundo!');
     }
 }
  function
ejemplo (MiClase $objeto){
   
$objeto::miMetodoDeLlamadaDeRetorno();
   }
 
$nueva_clase = new MiClase();
 
ejemplo($nueva_clase);
?>



En caso de que la clase <?php $nueva_clase ?> no fuese la clase definido en la función nos daría un error similar a este:

PHP Catchable fatal error:  Argument 1 passed to ejemplo() must be an instance of MiClase, instance of Miclase2 given, called in /home/vagrant/pruebas/clase.php on line 19 and defined in /home/vagrant/pruebas/clase.php on line 10

Catchable fatal error: Argument 1 passed to ejemplo() must be an instance of MiClase, instance of Miclase2 given, called in /home/vagrant/pruebas/clase.php on line 19 and defined in /home/vagrant/pruebas/clase.php on line 10


Y con esto llegamos a PHP 7 y ampliamos los tipos de de parámetros que se pueden definir, ahora podemos definir adicionalmente los siguientes parámetros:
bool (boleano).
float (número con decimales).
int (número entero).
string (cadena de texto.

En PHP 7 los errores de tipo de variable los devuevle \TypeError exception en vez de "fatal error"

Hay que tener en cuenta que en PHP 7 la definición de los tipos de parámetros es cohercitiva, esto significa que si la validación del parámetro no sale correcto intenta convertirlo al tipo definido. Este cambio cohercitivo tiene el punto negativo de que se pierde precisión.

Algunos ejemplos de pérdida de precisión

Una variable float como podría ser 35.37 al pasarla a int se quedaría en 35.
Una cadena de string 1.23float se convierte a 1.23 al pasarlo a float.



PHP también nos permite definir el tipo valor de retorno de funciones:

<?php
function divide (int $a, int $b): int
{
  return
$a\$b;
}
?>