(PHP 8 >= 8.5.0)
Атрибут откладывает проверку цели внутренних атрибутов и генерацию ошибок с этапа компиляции до момента создания экземпляра объекта отражения атрибута через API-интерфейс модуля Reflection.
После нацеливания атрибута на объявление недопустимое нацеливание других внутренних атрибутов на той же цели не вызовет ошибку компиляции. Проверка откладывается и выполняется только в момент создания объекта отражения атрибута методом ReflectionAttribute::newInstance().
Главное назначение атрибута — сделать текущий код совместимым с будущими версиями языка: атрибут разрешает текущему коду работать без ошибок при разметке атрибутами целей, совместимость с которыми появится только в новых версиях языка.
Пример #1 Пример откладывания проверки недопустимой цели атрибута
<?php
class Base
{
protected function foo(): void {}
}
class Child extends Base
{
#[\DelayedTargetValidation]
#[\Override]
public const NAME = 'child';
#[\Override]
protected function foo(): void {}
}Ошибка компиляции не возникнет в PHP-версиях, в которых нацеливание атрибута Override на константы класса не поддерживается.
Пример #2 Пример выполнения проверки атрибута при интроспекции кода
<?php
$reflection = new ReflectionClassConstant(Child::class, 'NAME');
foreach ($reflection->getAttributes() as $attribute) {
$attribute->newInstance(); // Разметка атрибутом недопустимой цели спровоцирует ошибку
}Проверка цели атрибута, который применили к объявлению вместе с атрибутом DelayedTargetValidation, выполняется только в момент вызова метода ReflectionAttribute::newInstance(), когда создаётся объект отражения атрибута. При разметке несовместимой цели выбрасывается ошибка. Проверка цели самого́ атрибута DelayedTargetValidation не выполняется.
Атрибут влияет на проверку целей только внутренних атрибутов.
Атрибут не подавляет саму функциональную проверку, которую выполняют атрибуты. Например, атрибут Override по-прежнему вызовет ошибку, если метод, на который нацелили атрибут, не переопределяет родительский метод.