Le type hinting consiste à permettre le typage d'arguments dans un langage normalement non typé.
Concrètement, cela signifie que nous pouvons nous assurer que les arguments d'une fonctions seront d'un type particulier.
Le type hinting a principalement deux avantages : il permet d'auto-documenter le code et il réduit les risques de bug en limitant les comportements imprévus.
En PHP, il est possible de faire du type hinting sur les fonctions.
Spécifiquement, il est possible de définir un type pour des arguments, ainsi qu'un type pour le retour de la fonction.
Il est possible de définir un type scalaire (string, float, int, bool), mais aussi des types plus complexes (array, object, instance d'une classe, etc.).
Pour déclarer un type pour un argument, il suffit d'écrire le type avant l'argument.
Ex, pour une fonction is_square qui attend deux entiers :
<?php
function is_square (int $width, int $height)
{
if ($width == $height)
{
return true;
}
return false;
}Pour déclarer un type pour un argument, il suffit d'écrire : type_voulu après le nom de la fonction
Ex, pour une fonction is_square qui retourne un bool :
<?php
function is_square (int $width, int $height) : bool
{
if ($width == $height)
{
return true;
}
return false;
}Pour certains arguments, notamment ceux qui doivent être optionnel, on peut parfois souhaiter définir un type, par exemple int, mais permettre à l'argument de prendre une valeur par défaut null.
Ex, si on veut que is_square puisse prendre 4 cotés.
<?php
function is_square (int $width, int $height, ?int $width2 = null, ?int $height2 = null) : bool
{
if ($width2 !== null || $height2 !== null)
{
if ($width2 != $width || $height2 != $height)
{
return false;
}
}
if ($width == $height)
{
return true;
}
return false;
}Pour cela, il suffit de rajouter un ? avant le type.
On peut faire la même chose pour le retour de la fonction.
Le fait de déclarer un type pour un argument peut avoir deux conséquences différentes en PHP.
Par défaut, si on passe un argument d'un type différent de celui attendu, il sera casté.
<?php
function show_type ($v) { echo gettype($v); }
function show_type_i (int $v) { echo gettype($v); }
show_type('10'); //show string
show_type_i('10'); //show integerMais si on active le typage strict, une erreur fatale sera levée.
Pour cela, on utilise la méthode declare avec strict_types.
<?php
declare(strict_types = 1);
function show_type ($v) { echo gettype($v); }
function show_type_i (int $v) { echo gettype($v); }
show_type('10'); //show string
show_type_i('10'); //lève une erreur TypeError