PHP7 et Type Hinting

Le type hinting, c'est quoi ?

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.

Comment ça fonctionne

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.).

Déclarer un type pour un argument

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;
    }

Déclarer un type pour un retour de fonction

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;
    }

Ajouter un nullable

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.

Conséquences d'une déclaration de type

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 integer

Mais 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

Type hinting

By plebweb

Type hinting

  • 438