Hackの真髄:カオスなPHPを「堅牢な要塞」へ変える段階的移行の極意
こんにちは。HHVMの深淵で日々型推論アルゴリズムと格闘しているチーフアーキテクトです。
PHPという自由奔放な言語から、Hackという規律ある言語へ。この移行は単なる文法の書き換えではありません。「実行時にしか分からないエラー」を「コンパイル時に潰す」という、エンジニアとしての防衛線そのものをシフトさせる作業です。
今日は、既存のPHPコードを破壊することなく、HackのStrict Mode(厳格モード)という「聖域」へ安全にたどり着くための戦略をお話しします。
—
1. なぜ「段階的(Partial)」なのか?
Hackには`// @partial`と`// @strict`という二つの世界線があります。
いきなりStrict Modeで既存のPHPコードを書き換えてはいけません。それは砂上の楼閣で地雷原を歩くようなものです。
- Partial Mode: 型定義をサボれる場所。PHPの「動的な自由さ」を残しつつ、一部だけ型を恩恵を受けられる。
- Strict Mode: Hackの真の力。型チェッカー(hh_client)が全コードを掌握し、一切の曖昧さを許さない。
移行の鉄則: まずはPartialで「型を足場」にし、徐々にStrictの「領域」を広げていくのです。
—
2. 段階的移行の3ステップ・戦略
既存のコードを壊さないための、現実的かつ最も安全なステップはこれです。
Step 1: `// @partial` で「型という名の保険」をかける
まず、ファイルの一行目に `Step 2: 関数シグネチャの「要塞化」
次に、関数の引数と戻り値に型を記述します。これだけで、関数間のインターフェースが固定されます。
「中身は未完成でも、入り口と出口だけは保証する」こと。これだけで、システム全体に波及するバグを局所化できます。
Step 3: `// @strict` への昇格
関数の中身まで型定義が完璧になったら、いよいよファイル冒頭のコメントを `// @strict` に書き換えます。型チェッカーが「お前はもう大人だ。一切の曖昧さを許さない」と牙を剥いてきますが、安心してください。それが「バグのないコード」への最短ルートです。
—
3. 陥りやすい「型の落とし穴」
移行中に初心者が必ずぶつかる壁がいくつかあります。これを知っているだけで、デバッグ時間は半分になります。
- Nullability(Null許容型)の罠:
Hackはデフォルトで「Nullは絶対に許さない」というスタンスです。PHPのように「戻り値が数値かNullか分からない」というコードは、`?float` と明示しない限り型エラーになります。
- 解決策: 「ここはNullがあり得る」と疑う癖をつけ、`if ($val is nonnull)` でガード節を書きましょう。
- Shape(形状)の活用:
連想配列(`array`)は型安全の敵です。`$user[‘name’]` と書くと、キーが存在するかどうかが保証されません。
- Hackの極意: `shape` 型を使いましょう。
type User = shape(‘name’ => string, ‘age’ => int);
function greet(User $u): void {
echo $u[‘name’]; // 型チェッカーが安心する
}
—
4. 最後に:型は「制約」ではなく「設計図」
型定義を書くことを「面倒だ」と感じるかもしれません。しかし、それは逆です。
型を書くということは、「この関数はどうあるべきか?」を自問自答することに他なりません。設計が曖昧だから型が決まらないのです。型定義を埋めていく作業は、あなたの書いたコードの設計を見直し、磨き上げるプロセスそのものです。
ここをクリアすれば、あなたはもうPHPのランタイムエラーに怯える必要はありません。HHVMという最強の相棒が、あなたのコードを常に監視し、リリース前にバグを弾き飛ばしてくれます。
準備はいいですか?まずはファイルの一行目から。あなたのコードを「堅牢な要塞」へと進化させていきましょう。
何か分からないことがあれば、いつでもHHVMの奥深くまで聞きに来てください。応援していますよ。