(PHP 8 >= 8.5.0)
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.
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.
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.