【PHP8.x】IS_REPEATABLE定数の使い方

IS_REPEATABLE定数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

IS_REPEATABLE定数は、PHP 8で導入されたAttribute(属性)が、同じ宣言箇所に対して複数回適用できるかどうかを表す定数です。この定数は、Attributeクラス内で定義される内部定数の一つであり、特定の属性クラスがどのように振る舞うべきかを指定するために使用されます。

PHP 8では、クラス、メソッド、プロパティ、関数などのプログラム要素に対して、メタデータ(付加的な情報)を付与するAttribute(属性)機能が導入されました。このIS_REPEATABLE定数は、開発者が独自の属性クラスを定義する際に、その属性が「繰り返し可能」であるかを制御するために利用します。

具体的には、属性クラスを定義する際に、そのクラス自身の宣言の上に#[Attribute]属性を記述します。この#[Attribute]属性の引数としてAttribute::IS_REPEATABLEを指定することで、定義しようとしている属性が、同じ対象(例えば一つのメソッド)に複数回記述できることを示します。

例えば、あるメソッドに対して#[MyValidation(rule: "required")]#[MyValidation(rule: "minLength", value: 5)]のように、同じMyValidation属性を異なる引数で複数回適用したい場合、MyValidation属性クラスの定義においてAttribute::IS_REPEATABLEを指定する必要があります。これにより、複数の属性インスタンスが生成され、それぞれが独立した情報を持つことができるようになります。

この定数を指定しない場合、デフォルトでは属性は繰り返し適用できません。つまり、一度同じ属性を適用すると、二度目の適用はエラーとなるか、無視されることになります。IS_REPEATABLE定数は、属性の適用方法に柔軟性を持たせ、より多様なメタデータ管理を可能にするための重要な要素です。

構文(syntax)

1<?php
2
3#[Attribute(Attribute::TARGET_CLASS | Attribute::IS_REPEATABLE)]
4class MyRepeatableAttribute
5{
6    public function __construct(public string $message) {}
7}

引数(parameters)

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHP Attribute IS_REPEATABLE で属性を繰り返し適用する

1<?php
2
3#[Attribute(Attribute::IS_REPEATABLE)]
4class MyAttribute
5{
6    public function __construct(public string $value) {}
7}
8
9#[MyAttribute('First')]
10#[MyAttribute('Second')]
11class MyClass
12{
13    public function myFunction(): void
14    {
15        $reflection = new ReflectionClass($this);
16        $attributes = $reflection->getAttributes(MyAttribute::class);
17
18        foreach ($attributes as $attribute) {
19            $instance = $attribute->newInstance();
20            echo $instance->value . PHP_EOL;
21        }
22    }
23}
24
25$myClass = new MyClass();
26$myClass->myFunction(); // 出力: First \n Second

PHP 8 の Attribute クラスにおける IS_REPEATABLE 定数は、カスタム属性を複数回適用可能にするためのものです。この定数を属性クラスに指定することで、同じ属性をクラス、メソッド、プロパティなどに対して複数回付与できます。

上記のサンプルコードでは、MyAttribute というカスタム属性を定義しています。#[Attribute(Attribute::IS_REPEATABLE)] の記述により、MyAttribute は繰り返し適用可能になります。MyClass クラスには、#[MyAttribute('First')]#[MyAttribute('Second')] のように、MyAttribute が2回適用されています。

myFunction メソッド内では、リフレクションを使用して MyClass に付与された MyAttribute インスタンスを取得し、それぞれの属性の value プロパティを出力しています。$reflection->getAttributes(MyAttribute::class) は、MyClass に付与された MyAttribute 属性の情報を配列として返します。$attribute->newInstance() で属性のインスタンスを生成し、$instance->value で属性のコンストラクタで設定された値にアクセスしています。

IS_REPEATABLE を使用しない場合、同じ属性を複数回適用しようとするとエラーが発生します。IS_REPEATABLE を指定することで、属性を複数回利用でき、より柔軟なメタデータ定義が可能になります。この機能は、例えば、バリデーションルールや設定情報を複数指定したい場合に役立ちます。

Attribute::IS_REPEATABLEは、Attributeクラスに付与できる定数で、同じ属性を複数回使えるようにするためのものです。この定数を指定しない場合、同じ属性を繰り返し使うとエラーになります。サンプルコードでは、MyAttributeクラスにAttribute::IS_REPEATABLEを指定することで、MyClassMyAttributeを複数回付与することを許可しています。属性を繰り返し利用する意図がない場合は、この定数を指定しないように注意してください。また、属性をReflectionで取得する際には、getAttributes()メソッドを利用します。取得した属性は、newInstance()メソッドでインスタンス化することで、属性に渡された引数にアクセスできます。