Modern PHP Features
Thème :
Junior
2 vues ·9/21 leçonsIntroduction aux Attributs (PHP 8.0+)
Les attributs sont des métadonnées structurées que l’on peut attacher aux classes, méthodes, propriétés, paramètres et plus encore. Ils remplacent les annotations docblock par une solution native et type-safe.
La Syntaxe de Base
<?php
#[Attribute]
class Route {
public function __construct(
public string $path,
public string $method = 'GET'
) {}
}
#[Route('/users', 'GET')]
class UserController {
#[Route('/users/{id}', 'GET')]
public function show(int $id): User {}
#[Route('/users', 'POST')]
public function create(): User {}
}
Les Attributs Intégrés à PHP
#[Override] (PHP 8.3+)
Garantit qu’une méthode surcharge bien une méthode parente :
<?php
class Animal {
public function speak(): string {
return 'Un son quelconque';
}
}
class Dog extends Animal {
#[Override]
public function speak(): string { // OK - surcharge le parent
return 'Wouf !';
}
#[Override]
public function bark(): string { // Erreur ! Pas de méthode parente
return 'Boum !';
}
}
#[Deprecated] (PHP 8.4+)
Marquer du code comme déprécié :
<?php
class Api {
#[Deprecated('Utiliser newMethod() à la place', since: '2.0')]
public function oldMethod(): void {
// Code legacy
}
public function newMethod(): void {
// Nouvelle implémentation
}
}
#[SensitiveParameter] (PHP 8.2+)
Cacher les données sensibles dans les stack traces :
<?php
function authenticate(
string $username,
#[SensitiveParameter] string $password
): bool {
// Si une exception survient, $password n'apparaîtra PAS dans la stack trace
return verify($username, $password);
}
Les Cibles des Attributs
<?php
#[Attribute(Attribute::TARGET_CLASS)] // Seulement sur les classes
#[Attribute(Attribute::TARGET_METHOD)] // Seulement sur les méthodes
#[Attribute(Attribute::TARGET_PROPERTY)] // Seulement sur les propriétés
#[Attribute(Attribute::TARGET_PARAMETER)] // Seulement sur les paramètres
#[Attribute(Attribute::TARGET_CLASS_CONSTANT)] // Seulement sur les constantes
#[Attribute(Attribute::TARGET_ALL)] // Partout (par défaut)
// Combiner des cibles
#[Attribute(Attribute::TARGET_CLASS | Attribute::TARGET_METHOD)]
class MyAttribute {}
Les Attributs Répétables
<?php
#[Attribute(Attribute::TARGET_METHOD | Attribute::IS_REPEATABLE)]
class Middleware {
public function __construct(public string $name) {}
}
class Controller {
#[Middleware('auth')]
#[Middleware('logging')]
#[Middleware('cache')]
public function index(): Response {}
}
Exemple Concret
Des attributs de validation personnalisés
<?php
declare(strict_types=1);
// Exemple d'attributs de validation
#[Attribute(Attribute::TARGET_PROPERTY)]
class Required {
public function __construct(public string $message = 'Ce champ est requis') {}
}
#[Attribute(Attribute::TARGET_PROPERTY)]
class Email {
public function __construct(public string $message = 'Format email invalide') {}
}
#[Attribute(Attribute::TARGET_PROPERTY)]
class MinLength {
public function __construct(
public int $min,
public string $message = 'Trop court'
) {}
}
// Utilisation
class UserDTO {
#[Required]
#[MinLength(2)]
public string $name;
#[Required]
#[Email]
public string $email;
#[Required]
#[MinLength(8, message: 'Le mot de passe doit faire au moins 8 caractères')]
public string $password;
}
?>
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 Introduction aux Attributs (PHP 8.0+). Continuez votre apprentissage avec la prochaine leçon ou explorez d'autres formations.