Modern PHP Features
Thème :
Junior
1 vues ·4/21 leçons

Le Rétrécissement de Types & Les Assertions

Le système de types de PHP 8 fonctionne avec l’analyse du flux de contrôle pour rétrécir les types en fonction des conditions.

Le Rétrécissement Automatique de Types

<?php
function process(string|int|null $value): string
{
    // À ce stade : string|int|null

    if ($value === null) {
        return 'vide';
    }
    // Maintenant : string|int (null exclu)

    if (is_string($value)) {
        return strtoupper($value);  // Méthodes string OK
    }
    // Maintenant : int uniquement

    return (string) $value;  // int → string
}

Rétrécissement avec instanceof

<?php
interface Renderable {
    public function render(): string;
}

interface Cacheable {
    public function getCacheKey(): string;
}

function display(object $item): string
{
    $output = '';

    if ($item instanceof Renderable) {
        // $item est maintenant Renderable
        $output = $item->render();
    }

    if ($item instanceof Cacheable) {
        // $item est maintenant Cacheable
        $key = $item->getCacheKey();
    }

    return $output;
}

Les Assertions pour l’Analyse Statique

<?php
/**
 * @param mixed $value
 * @return User
 * @throws InvalidArgumentException
 */
function assertUser(mixed $value): User
{
    if (!$value instanceof User) {
        throw new InvalidArgumentException('Un objet User était attendu');
    }

    return $value;  // Le type est réduit à User
}

// Utilisation
$data = $cache->get('user');
$user = assertUser($data);
// $user est définitivement un User ici

Rétrécissement avec match

<?php
function handle(string|int|array $input): string
{
    return match(true) {
        is_string($input) => "Chaîne : $input",
        is_int($input) => "Entier : $input",
        is_array($input) => "Tableau : " . count($input) . " éléments",
    };
}

La Fonction assert()

<?php
// Assertions en développement
assert($user instanceof User, 'Une instance User était attendue');

// En production, les assertions peuvent être désactivées :
// zend.assertions = -1 dans php.ini

// Gestionnaire d'assertion personnalisé
set_assert_callback(function(string $file, int $line, ?string $assertion) {
    throw new AssertionError("Assertion échouée : $assertion dans $file:$line");
});

Les Assertions PHPStan/Psalm

<?php
/**
 * @phpstan-assert User $value
 * @psalm-assert User $value
 */
function assertIsUser(mixed $value): void
{
    if (!$value instanceof User) {
        throw new TypeError('Un User était attendu');
    }
}

function processUser(mixed $data): void
{
    assertIsUser($data);
    // Les analyseurs statiques savent maintenant que $data est un User
    echo $data->getName();  // Pas d'erreur !
}

Les Grimoires


📘 Cette leçon fait partie du cours PHP 8.x Moderne : Les Dernières Fonctionnalités du Langage sur la plateforme d’apprentissage RostoDev.

Prêt à passer à la suite ?

Vous avez terminé cette leçon sur Le Rétrécissement de Types & Les Assertions. Continuez votre apprentissage avec la prochaine leçon ou explorez d'autres formations.