PHP 8.4.22 Released!

DelayedTargetValidation アトリビュート

(PHP 8 >= 8.5.0)

はじめに

このアトリビュートは、内部アトリビュートに対する適用対象の検証エラーを、 コンパイル時から、Reflection API を通じてアトリビュートがインスタンス化される時点へと遅延させます。

宣言に適用すると、同じ適用対象における内部アトリビュートの不正な使用は、 コンパイル時のエラーを引き起こしません。代わりに検証は先送りされ、 ReflectionAttribute::newInstance() を通じてアトリビュートがインスタンス化される時点で実行されます。

これは主に前方互換性を意図したものであり、 将来の PHP バージョンで有効な適用対象が追加されうるアトリビュートを使うコードを、 古いバージョンで壊さずに済むようにします。

クラス概要

#[\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 {}
}

Override がクラス定数に対して使えない PHP バージョンであっても、 これはコンパイル時のエラーを発生させません。

例2 検証はリフレクション時に行われる

<?php

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

foreach (
$reflection->getAttributes() as $attribute) {
$attribute->newInstance(); // 不正な場合はスローされる可能性がある
}

同じ適用対象に適用されたアトリビュート(DelayedTargetValidation 自身を除く)が、 ReflectionAttribute::newInstance() を使ってリフレクション経由でインスタンス化されると、 適用対象の検証が実行され、サポートされていない適用対象でアトリビュートが使われていれば 例外がスローされる可能性があります。

注意

このアトリビュートは、内部アトリビュートの適用対象の検証にのみ影響します。

これらのアトリビュートが実行する機能的な検証を抑制するわけではありません。 たとえば Override は、 メソッドが実際には親のメソッドをオーバーライドしていない場合に、引き続きエラーを発生させます。

add a note

User Contributed Notes

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