Readonly プロパティ (PHP 8.1)
CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 19/91。
PHP 8.1 では、一度だけ値を代入でき、その後は変更できない readonly プロパティが導入されました。定数とは異なり、readonly プロパティはクラスの定義時ではなく、オブジェクトの初期化時に設定されます。
型宣言の前に readonly キーワードを追加することで、readonly プロパティを宣言します:
<?php
class User {
public readonly string $id;
public readonly string $name;
public function __construct(string $id, string $name) {
$this->id = $id;
$this->name = $name;
}
}
$user = new User("U001", "Alice");
echo $user->id . "\n";
echo $user->name;
出力:
U001
Alice一度割り当てられると、readonlyプロパティを変更しようとするとエラーが発生します。そのため、IDや作成タイムスタンプのように、オブジェクトの存続期間を通じて一定であるべき値に最適です。
readonly プロパティは型宣言を持つ必要があり、宣言されたクラス内(通常はコンストラクタ内)から一度だけ値を代入できます。通常のプロパティとは異なり、宣言時にデフォルト値を指定することはできません。これらは、どの可視性修飾子とも組み合わせて使用できます。
<?php
class Product {
public function __construct(
public readonly string $sku,
private readonly float $cost
) {}
public function getCost(): float {
return $this->cost;
}
}
$product = new Product("ABC123", 29.99);
echo $product->sku;
出力:
ABC123重要なポイント: Readonlyプロパティは、プロパティレベルでの不変性(イミュータビリティ)を提供します。これらは、オブジェクトを識別するデータや、作成後に変更すべきではないデータに最適であり、実行時の初期化という柔軟性と、誤った変更を防ぐという安全性を兼ね備えています。
チャレンジ
簡単初期化後に重要な設定が誤って変更されないように、readonlyプロパティを使用して不変(イミュータブル)な設定システムを構築しましょう。
アプリケーションの設定を管理するために、連携して動作する2つのファイルを作成します:
Config.php— 不変の設定を持つアプリケーション設定を表すConfigクラスを定義します。このクラスには、3つのpublicなreadonlyプロパティstring $appName、string $version、およびint $maxConnectionsを持たせる必要があります。コンストラクタのプロパティ昇格(constructor promotion)を使用して、これら3つのreadonlyプロパティを単一の簡潔なコンストラクタ定義で宣言および初期化してください。"[appName] v[version] (max: [maxConnections] connections)"という形式の文字列を返すgetInfo()メソッドを追加してください。main.php— Configクラスファイルをインクルードします。アプリ名、バージョン、最大接続数(整数に変換する必要がある文字列として)の3つの入力を受け取ります。これらの値を使用してConfigオブジェクトを作成します。最初の行にgetInfo()の結果を出力してください。次に、アプリ名、バージョン、最大接続数の各readonlyプロパティに直接アクセスして、それぞれの値を個別の行に出力してください。
readonlyプロパティを使用することで、一度設定が作成されるとその値が固定されることが保証されます。これは、アプリケーションの実行中ずっと一定であるべき設定に最適です。コンストラクタのプロパティ昇格とreadonlyを組み合わせることで、不変のバリューオブジェクトを非常に簡潔に定義できることに注目してください。
出力には、フォーマットされた情報文字列に続いて各プロパティの値が表示され、readonlyプロパティがクラスの外部から引き続き読み取り可能であることを示します。
自分で試してみよう
<?php
require_once 'Config.php';
// 入力を読み込む
$appName = trim(fgets(STDIN));
$version = trim(fgets(STDIN));
$maxConnections = intval(trim(fgets(STDIN)));
// TODO: 入力値を使用して Config オブジェクトを作成する
// TODO: getInfo() の結果を出力する
// TODO: 各 readonly プロパティをそれぞれの行に出力する:
// - app name
// - version
// - max connections
?>このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
3クラスのプロパティ
インスタンスプロパティと静的プロパティクラス定数静的メソッドとプロパティPrivate と Protected プロパティReadonly プロパティ (PHP 8.1)まとめ:銀行口座マネージャー