Modern PHP Features
Thème :
Junior
1 vues ·4/21 leçonsLe 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.