Hackの真髄:`readonly`で「状態の迷宮」から脱出する
皆さん、こんにちは。Hack言語の深淵へようこそ。
大規模なコードベースを運用していると、必ずぶち当たる壁があります。それは「誰がいつ、この変数を書き換えたのか分からない」という、追跡不可能な副作用の悪夢です。
PHPから進化したHackが、なぜこれほどまでに堅牢なのか。その秘密の一つが、今回解説する`readonly`修飾子にあります。これを使えば、あなたのコードは「書き換えられることのない絶対的な真実」を保持できるようになります。さあ、安全な領域へ一緒に足を踏み入れましょう。
—
1. なぜ`readonly`が必要なのか?
大規模開発において、バグの温床の8割は「意図しない状態の書き換え」です。特にマルチスレッドや非同期処理が絡むHHVMの環境下では、ある場所で変更された値が、別の場所で予期せぬ挙動を引き起こす……なんてことは日常茶飯事。
`readonly`は、単なる「定数」ではありません。「初期化後は二度と変更を許さない」という契約(コントラクト)を、コンパイル時に型チェッカーで強制する強力な仕組みなのです。
—
2. `readonly`プロパティの基本
まずは、クラス内での基本的な使い方を見てみましょう。`readonly`は、そのプロパティが「コンストラクタで一度だけ設定され、以降は読み取り専用になる」ことを保証します。
<<__Strict>>
namespace MyProject;
class User {
// readonly修飾子を付けることで、この値は不変になります
public readonly string $username;
public function __construct(string $name) {
$this->username = $name; // コンストラクタでの初期化はOK
}
}
$user = new User(“HackMaster”);
echo $user->username; // 読み取りは可能
// $user->username = “NewName”;
// ↑ ここで型チェッカーが “Cannot modify readonly property” と怒ります。
// これが安全への第一歩です。
ここがポイント!
- コンストラクタのみ許可: `readonly`プロパティへの代入は、インスタンス生成時のコンストラクタ内でのみ許されます。
- 型チェッカーの鉄槌: もしコンストラクタ以外で値を書き換えようとすれば、HHVMの型チェッカー(hh_client)が即座にエラーを吐き出し、ビルドを止めます。つまり、実行時にバグを踏む前に、開発環境で排除できるということです。
—
3. 陥りやすい罠:参照と不変性の境界線
初心者がよくやってしまうミスは、「`readonly`だからオブジェクト自体も完全に不変だろう」と思い込んでしまうことです。ここには一つ注意が必要です。
class Container {
public readonly Map
public function __construct(Map
$this->items = $items;
}
}
実は、`readonly`が保証するのは「プロパティ自体が別の値(インスタンス)を指し直すことはできない」という点までです。もし`$items`がミュータブル(書き換え可能)なコレクションだった場合、コレクションの中身自体は書き換えられてしまう可能性があります。
解決策は「不変データ構造(Immutable)」との組み合わせです。 Hackでは、可能な限り`ImmMap`や`ImmVector`といった不変コレクションを使用することを推奨します。これらと`readonly`を組み合わせれば、鉄壁の守りが完成します。
—
4. 現場で役立つ実践的テクニック
実際の現場では、設定値の保持や、DTO(データ転送オブジェクト)の定義によく使われます。
// 堅牢なDTOの例
final class Config {
public function __construct(
public readonly string $host,
public readonly int $port,
) {}
}
// これにより、Configインスタンスは生成された瞬間から「変化しない安定した状態」となります。
// 関数に渡しても、中で書き換えられる心配が一切ないため、コードの可読性が飛躍的に向上します。
—
最後に:なぜこれにこだわるのか
Hackにおける厳格な型付けは、単なる「制約」ではありません。それは、「あなたのコードが、あなたの意図通りにしか動かないことを保証するツール」です。
`readonly`を活用することで、状態の変化を追う必要がなくなり、よりビジネスロジックの本質的な部分に集中できるようになります。この感覚を掴めれば、あなたはもうHackの初学者ではありません。
さあ、次はどの機能の深淵を覗いてみましょうか?あなたのコードが、より安全で、より美しいものになることを願っています。質問があれば、いつでも歓迎しますよ。