AllowDynamicProperties 属性の概要と実践的な使い方

AllowDynamicProperties とは

PHP 8.2 で追加された属性 #[AllowDynamicProperties] は、クラスに対して動的プロパティ(宣言されていないプロパティ)の使用を明示的に許可するためのものです。デフォルトでは未宣言のプロパティにアクセスすると E_DEPRECATED が発生し、将来的にエラーになる可能性があります。

導入背景

PHP は長年、クラスに宣言されていないプロパティへの代入を許容してきましたが、型安全性や IDE の補完精度向上の観点から、今後は厳格化されます。AllowDynamicProperties は、レガシーコードを段階的に移行するための「例外」的な手段として提供されました。

基本的な使い方

属性をクラス宣言の直前に付与します。

#[AllowDynamicProperties]
class LegacyModel {
    // 何もプロパティを宣言しない
}

$object = new LegacyModel();
$object->dynamicField = 'value'; // OK

ポイント

  • 属性はクラス単位で付与します。メソッドやプロパティ単位では使用できません。
  • 属性を付与しないクラスでは、未宣言プロパティへの代入は E_DEPRECATED(将来は E_ERROR)になります。
  • 属性は名前空間を含めても構いませんが、use 文は不要です。

実務での活用シーン

  • 古い ORM やテンプレートエンジンが動的にプロパティを付与するケース。
  • 外部ライブラリがデータコンテナとしてオブジェクトを使用し、プロパティの追加を前提としている場合。
  • 段階的に型宣言へ移行する際の暫定措置。

将来的な代替策

Long‑term では、以下のように明示的にプロパティを定義することが推奨されます。

class TypedModel {
    public string $name;
    public int $age;

    public function __set(string $property, $value): void {
        // 必要に応じて例外を投げるか、ロギングする
        throw new \LogicException("プロパティ {$property} は未定義です");
    }
}

この方法は型安全性を確保し、IDE や静的解析ツールの恩恵を受けやすくなります。

まとめ

AllowDynamicProperties は、PHP 8.2 で導入された「レガシー互換用」属性です。
新規開発では可能な限り未宣言プロパティを使用しない設計を目指し、どうしても必要な場合にだけ属性を付与してください。