(PHP 8 >= 8.5.0)
このアトリビュートは、内部アトリビュートに対する適用対象の検証エラーを、 コンパイル時から、Reflection API を通じてアトリビュートがインスタンス化される時点へと遅延させます。
宣言に適用すると、同じ適用対象における内部アトリビュートの不正な使用は、 コンパイル時のエラーを引き起こしません。代わりに検証は先送りされ、 ReflectionAttribute::newInstance() を通じてアトリビュートがインスタンス化される時点で実行されます。
これは主に前方互換性を意図したものであり、 将来の PHP バージョンで有効な適用対象が追加されうるアトリビュートを使うコードを、 古いバージョンで壊さずに済むようにします。
例1 不正な適用対象の検証を遅延させる
<?php
class Base {
protected function foo(): void {}
}
class Child extends Base {
#[\DelayedTargetValidation]
#[\Override]
public const NAME = 'child';
#[\Override]
protected function foo(): void {}
}Override がクラス定数に対して使えない PHP バージョンであっても、 これはコンパイル時のエラーを発生させません。
例2 検証はリフレクション時に行われる
<?php
$reflection = new ReflectionClassConstant(Child::class, 'NAME');
foreach ($reflection->getAttributes() as $attribute) {
$attribute->newInstance(); // 不正な場合はスローされる可能性がある
}同じ適用対象に適用されたアトリビュート(DelayedTargetValidation 自身を除く)が、 ReflectionAttribute::newInstance() を使ってリフレクション経由でインスタンス化されると、 適用対象の検証が実行され、サポートされていない適用対象でアトリビュートが使われていれば 例外がスローされる可能性があります。
このアトリビュートは、内部アトリビュートの適用対象の検証にのみ影響します。
これらのアトリビュートが実行する機能的な検証を抑制するわけではありません。 たとえば Override は、 メソッドが実際には親のメソッドをオーバーライドしていない場合に、引き続きエラーを発生させます。