やあ。Hackの深淵へようこそ。
私はHHVMの心臓部と日々対話している、ただのエンジニアだ。
PHPの「文字列や整数で状態を管理する」という悪習に、君も辟易していないか? あれは単なる「データ」であって「型」ではない。コードの海に潜むバグを型チェッカー(Hackの守護神)に見つけさせるためには、Enum(列挙型)を正しく使いこなすのが最短距離だ。
今日は、PHPの脆弱な定数管理から、Hackの堅牢なEnumの世界へ君を導こう。準備はいいかい?
—
1. なぜ「定数」では不十分なのか?
PHP時代、君たちはきっとこんなコードを書いていただろう。
// PHPの定数管理(脆い!)
class Status {
const PENDING = ‘pending’;
const ACTIVE = ‘active’;
}
function process(string $status): void {
// ここで何が渡されても型チェッカーは文句を言わない
// “hoge” とか “active ” (空白入り) が混ざっても実行時までバグは発覚しない
}
このコードの敗因は、「String型という広すぎる檻の中に、無数の値が混入できること」だ。HackのEnumは、この「値の集合」を厳格に封じ込める。
2. HackのEnum:堅牢性の正体
HackのEnumは、単なるラベルの集まりじゃない。「取り得る値の範囲をコンパイル時に確定させる」ための強力な武器だ。
// Enumの定義
enum Status: string {
PENDING = ‘pending’;
ACTIVE = ‘active’;
}
function process(Status $status): void {
// 引数が「Status型」と明示された瞬間、
// ここには ‘pending’ か ‘active’ しか入ってこないことが保証される
echo “Current status: ” . $status->getValue();
}
ここが極限の知見:Enumの網羅性(Exhaustiveness)
Hackの真骨頂は、`switch`文における「網羅性チェック」にある。もし君が新しい状態(例えば `ARCHIVED`)をEnumに追加したとき、修正漏れがあれば型チェッカーが即座に叫ぶ。「お前、このケースを処理し忘れているぞ!」と。
switch ($status) {
case Status::PENDING:
// …
break;
case Status::ACTIVE:
// …
break;
// もしARCHIVEDを追加したのにここを書き忘れると、Hackはビルドを許可しない
}
PHPのように「`default`で適当に処理してバグを埋め込む」という未来は、Hackには存在しないんだ。
3. 初学者が陥りやすい「罠」
Hackを学び始めた連中がよくやるミスを挙げておこう。これさえ避ければ君は一段上のレベルに行ける。
- 罠1:Enumの値を直接比較しようとする
- `if ($status == ‘active’)` はご法度だ。Enum型はあくまでオブジェクト的な振る舞いをする。比較するなら `if ($status === Status::ACTIVE)` を使うこと。これが型の一致だ。
- 罠2:Enumをただの連想配列だと思っている
- Enumは型システムの一部だ。実行時に動的にキーを追加したりはできない。この「不変性(Immutability)」こそが、大規模開発における正義なんだ。
4. 移行のステップ:どう進めるか?
既存の巨大なPHPプロジェクトから移行するなら、一気に変える必要はない。
1. 境界線を作る: まずは一番重要な状態管理(ユーザー権限や注文ステータスなど)をEnumに置き換える。
2. 型ヒントを厳格化する: `string` で受け取っていた引数を、すべて `Status` Enumに書き換える。ここでコンパイルエラーが大量に出るはずだ。それを一つずつ直すことが、バグを駆逐する儀式なんだ。
3. HSL(Hack Standard Library)を活用する: Enumの操作には `vec()` や `dict()` への変換メソッドが用意されている。`Status::getValues()` を使えば、ループ処理も型安全に記述できる。
—
先輩からのメッセージ
「型定義が面倒くさい」と思うかもしれない。だが、考えてみてくれ。書いている最中にエラーを教えてくれるコードと、ユーザーからの問い合わせでバグに気づくコード、どちらが君の人生を豊かにする?
HackのEnumは、君の論理的思考をコードに刻み込むための「型」だ。これさえクリアすれば、君はもうHackの基本を掌握したと言っていい。
さあ、エディタを開いて、その緩い定数管理を堅牢なEnumに書き換えてみよう。何か詰まったら、いつでも型チェッカー(そして私)に問いかけてくれ。応援しているよ。