(CJP) PHP 8.2 では、クラスを宣言する新しい方法が追加されました。クラスを読み取り専用にすることができます。 実際には、そのクラスのすべてのプロパティが読み取り専用になることを意味します。 これは、クラスが public readonly プロパティしか持たないデータ転送オブジェクトまたは値オブジェクトを使用している場合に特に便利です。
言い換えれば、これを書く代わりに:
class BlogData
public function __construct(
public readonly string $title,
public readonly Status $status,
public readonly ?DateTimeImmutable $publishedAt = null,
)
これで次のように記述できます。
readonly class BlogData
public function __construct(
public string $title,
public Status $status,
public ?DateTimeImmutable $publishedAt = null,
)
以前に読み取り専用プロパティについて書いたので、最初に簡単に要約しましょう。
- readonly プロパティは、通常はコンストラクターで 1 回だけ書き込むことができます。
- 型指定されたプロパティのみを読み取り専用にすることができます。
- デフォルト値を持つことはできません (昇格されたプロパティを使用している場合を除く)。
- の readonly 継承中にフラグを変更することはできません。 そして最後に
- 読み取り専用プロパティの設定を解除することはできません。
読み取り専用クラスは、そのクラスのすべてのプロパティを読み取り専用にするための構文糖衣にすぎないため、同じ規則が読み取り専用クラスにも適用されることを意味します。
# 一度書きます
読み取り専用クラスのすべてのプロパティは、1 回だけ書き込むことができ、設定を解除することはできません。
readonly class BlogData
$blogData = new BlogData();
$blogData->title = ‘other’;
unset($blogData->title);
# 型指定されたプロパティのみ
読み取り専用クラスは、型付きプロパティのみを持つことができます。
readonly class BlogData
public string $title;
public $mixed;
# 静的プロパティなし
読み取り専用プロパティは静的にできないため、読み取り専用クラスには静的プロパティを含めることはできません。
readonly class BlogData
public static string $title;
# デフォルト値なし
昇格したプロパティを使用していない限り、読み取り専用クラスのプロパティにデフォルト値を設定することはできません。
readonly class BlogData
public string $title = ‘default’;
readonly class BlogData
public function __construct(
public string $title = ‘default’,
)
# 継承時の変更なし
を変更することはできません。 readonly 継承時のクラス フラグ:
readonly class BlogData
class NewsItemData extends BlogData
# 動的プロパティなし
読み取り専用クラスも動的プロパティを許可しません。 PHP 8.2 では動的プロパティが非推奨になっているため、これは大きな影響はありませんが、追加できないことを意味します。 #[AllowDynamicProperties] 読み取り専用クラスへの属性:
readonly class BlogData
# 反射
最後に、クラスが読み取り専用かどうかを判断する新しいリフレクション メソッドがあります。 ReflectionClass::isReadOnly(). 使用することもできます ReflectionClass::getModifiers()、これには ReflectionClass::IS_READONLY 国旗。