Атрибут DelayedTargetValidation

(PHP 8 >= 8.5.0)

Введение

Атрибут откладывает проверку цели внутренних атрибутов и генерацию ошибок с этапа компиляции до момента создания экземпляра объекта отражения атрибута через API-интерфейс модуля Reflection.

После нацеливания атрибута на объявление недопустимое нацеливание других внутренних атрибутов на той же цели не вызовет ошибку компиляции. Проверка откладывается и выполняется только в момент создания объекта отражения атрибута методом ReflectionAttribute::newInstance().

Главное назначение атрибута — сделать текущий код совместимым с будущими версиями языка: атрибут разрешает текущему коду работать без ошибок при разметке атрибутами целей, совместимость с которыми появится только в новых версиях языка.

Обзор класса

#[\Attribute]
final class DelayedTargetValidation {
}

Примеры

Пример #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 по-прежнему вызовет ошибку, если метод, на который нацелили атрибут, не переопределяет родительский метод.

Смотрите также

Добавить

Примечания пользователей

Пользователи ещё не добавляли примечания для страницы
To Top