La versión 7 de PHP extiende la característica de declaración de tipo escalar también al valor de retorno de una función. De acuerdo con esta nueva disposición, la declaración de tipo de valor devuelto especifica el tipo de valor que debe devolver una función. Podemos declarar los siguientes tipos para los tipos de retorno:
- int
- float
- bool
- string
- interfaces
- array
- callable
Para implementar la declaración de tipo de valor devuelto, se define una función como −
function myfunction(type $par1, type $param2): type {
# function body
return $val;
}
El analizador de PHP es un tipo coercitivo por defecto. Debe declarar «strict_types=1» para aplicar una verificación más estricta del tipo de variable que se va a devolver con el tipo utilizado en la definición.
Ejemplo
En el ejemplo siguiente, la función division() se define con un tipo de valor devuelto como int.
<?php
function division(int $x, int $y): int {
$z = $x/$y;
return $z;
}
$x=20.5;
$y=10;
echo "First number: " . $x;
echo "\nSecond number: " . $y;
echo "\nDivision: " . division($x, $y);
?>
Dado que la comprobación de tipos no se ha establecido en strict_types=1, la división tiene lugar incluso si uno de los parámetros no es entero.
First number: 20.5
Second number: 10
Division: 2
Sin embargo, tan pronto como agrega la declaración de strict_types en la parte superior del script, el programa genera un mensaje de error fatal.
Fatal error: Uncaught TypeError:division():Argument#1 ($x) must be of type int, float given, called in div.php on line 12 and defined in div.php:3
Stack trace:#0 div.php(12): division(20.5, 10)#1 {main}
thrown in div.php on line 3
VS Code advierte sobre el error incluso antes de ejecutar el código mostrando líneas de error en la posición de error:
Ejemplo
Para hacer que la función division() devuelva un float en lugar de int, convierta el numerador a float y vea cómo PHP genera el error fatal −
<?php
// declare(strict_types=1);
function division(int $x, int $y): int {
$z = (float)$x/$y;
return $z;
}
$x=20;
$y=10;
echo "First number: " . $x;
echo "\nSecond number: " . $y;
echo "\nDivision: " . division($x, $y);
?>
Quite la marca de comentario de la declaración en la parte superior y ejecute este código aquí para comprobar su salida. Mostrará un error:
First number: 20
Second number: 10PHP Fatal error: Uncaught TypeError: division(): Return value must be of type int, float returned in /home/cg/root/14246/main.php:5
Stack trace:
#0 /home/cg/root/14246/main.php(13): division()
#1 {main}
thrown in /home/cg/root/14246/main.php on line 5