L'attribut DelayedTargetValidation

(PHP 8 >= 8.5.0)

Introduction

Cet attribut diffère les erreurs de validation de cible des attributs internes, du moment de la compilation à celui où l'attribut est instancié via l'API de réflexion.

Lorsqu'il est appliqué à une déclaration, toute utilisation invalide d'attributs internes sur la même cible ne déclenche pas d'erreur à la compilation. À la place, la validation est différée et effectuée lorsque l'attribut est instancié via ReflectionAttribute::newInstance().

Cela vise principalement la compatibilité ascendante, permettant à du code d'utiliser des attributs susceptibles d'acquérir de nouvelles cibles valides dans de futures versions de PHP, sans échouer sur les versions plus anciennes.

Synopsis de la classe

#[\Attribute]
final class DelayedTargetValidation {
}

Exemples

Exemple #1 Différer la validation d'une cible invalide

<?php

class Base {
protected function
foo(): void {}
}

class
Child extends Base {

#[
\DelayedTargetValidation]
#[
\Override]
public const
NAME = 'child';

#[
\Override]
protected function
foo(): void {}
}

Sur les versions de PHP où Override n'est pas autorisé sur les constantes de classe, cela ne produit pas d'erreur à la compilation.

Exemple #2 La validation a lieu lors de la réflexion

<?php

$reflection
= new ReflectionClassConstant(Child::class, 'NAME');

foreach (
$reflection->getAttributes() as $attribute) {
$attribute->newInstance(); // Peut lever une exception si invalide
}

Lorsqu'un attribut quelconque appliqué à la même cible (autre que DelayedTargetValidation lui-même) est instancié via la réflexion à l'aide de ReflectionAttribute::newInstance(), la validation de cible est effectuée et une exception peut être levée si l'attribut est utilisé sur une cible non prise en charge.

Notes

Cet attribut n'affecte que la validation de cible des attributs internes.

Il ne supprime pas la validation fonctionnelle effectuée par ces attributs. Par exemple, Override émettra toujours une erreur si une méthode ne redéfinit pas réellement une méthode parente.

add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top