レガシーPHPをHackの静的型安全圏へ:『Partial Mode』で実現する無停止・漸進的モダナイゼーション
大規模なPHPコードベースを抱えるチームにとって、Hackへの完全移行は「飛行中にエンジンを換装する」に等しい。だが、恐れることはない。我々が用意した『Partial Mode』は、カオスなPHPの荒波の中で、型安全という名のアンカーを確実に打ち込むための洗練されたツールだ。
この記事では、型検査の甘いPHPを、いかにして堅牢なHackの世界へ引きずり込むか。その戦略と、実務で即座に通用する設計パターンを伝授する。
—
1. なぜ「全面リライト」が愚策なのか
PHPからHackへの移行で陥りがちな罠が「一括変換」だ。型エラーの洪水に溺れ、開発が停止すれば、ビジネスは死ぬ。
HHVMの真髄は、「動的型付けの柔軟性」と「静的型付けの最適化」を共存させることにある。`// @partial` モードを活用せよ。これは、コンパイラに対して「このファイルはまだ未完成だが、型チェックの適用を許可する」と宣言する儀式だ。
移行の黄金律:外縁から中心へ
1. データ構造(Shape/Enum)の定義: 最初に「データ」を型定義する。
2. HSLの浸透: `array` の代わりに `vec`, `dict`, `keyset` を利用する。
3. インターフェースの厳格化: 依存注入(DI)の境界から型を強制する。
—
2. 現場で使える『Partial Mode』運用術
まずは、レガシーな関数を少しずつHackの世界へ誘い込む例を見てほしい。
// @partial
// ファイルの先頭にこれを置くことで、Hackは型チェックを段階的に強制する。
// すべてのエラーを解消する必要はない。まずは「型エラーが検出可能」な状態を作る。
namespace App\Legacy;
/
- レガシーな配列操作から、型安全な dict への橋渡し
/
function process_user_data(mixed $input): dict
// PHPの弱点である「型が不明な配列」を、静的なShape/dictで包み込む
if (!is_array($input)) {
return dict[];
}
// ここで型チェックが働く。$input が dict かどうかを厳密に照合する
$data = dict($input);
// HSLの活用:array_mapの代わりに vec\map などを使用する
// パフォーマンスと安全性が劇的に向上する
return dict[
‘id’ => (string)($data[‘id’] ?? ‘0’),
‘name’ => (string)($data[‘name’] ?? ‘unknown’),
];
}
このコードのポイント:
- `mixed` の最小化: 最初は `mixed` で受けてもいい。しかし、関数内部の出口では必ず `dict` や `vec` のような具体的な型へキャストする。これが「型安全の境界線」となる。
- HSL(Hack Standard Library)の採用: `array` はメモリ効率が悪く、境界条件が曖昧だ。`dict` への変換を習慣化するだけで、HHVMのJITコンパイラは驚くほど最適化を効かせやすくなる。
—
3. 非同期API連携:型安全な境界設計
外部サービスと連携する際、最もバグを生みやすいのは「レスポンスの構造」だ。ここで `shape` を使うのが正解だ。
// 外部APIレスポンスの型定義
type UserApiResponse = shape(
‘id’ => int,
‘username’ => string,
‘email’ => string,
);
/
- APIクライアントの堅牢な実装
/
async function fetch_user_profile(int $id): Awaitable
// 外部からのデータは常に「信用できない」
// HHVMの型システムを通すことで、ランタイムエラーをコンパイル時に検知する
$raw_data = await call_external_api(‘/users/’ . $id);
// JSONデコード結果をshapeにキャストする(厳格なチェック)
return shape(
‘id’ => (int)$raw_data[‘id’],
‘username’ => (string)$raw_data[‘username’],
‘email’ => (string)$raw_data[‘email’],
);
}
なぜこれが美しいのか?
この `shape` 定義がコードベースの「契約(Contract)」となる。もしAPIの仕様が変われば、コンパイル時にエラーが出る。これこそが、テストコードを何百行書くよりも強力な「防御」なのだ。
—
4. パフォーマンスを最大限引き出すために
Hackの型システムは、単なる「安全装置」ではない。HHVMが型を完全に理解していれば、実行時のタイプチェック(Type Guard)を省ける。 これがパフォーマンス向上に直結する。
1. `readonly` の活用: データ構造の不変性を担保し、メモリ領域の共有を最適化する。
2. `vec` と `dict` の徹底: PHPの `array` はハッシュマップとして実装されているが、`vec` は連続したメモリ領域として最適化される。ループ処理の速度が数倍変わることもある。
3. 型エラーを警告ではなく「エラー」にする: `hhvm.php_fatal_errors = true` に設定し、型安全性に妥協しない文化をチームに醸成せよ。
—
最後に:伝説のコミッターからの助言
移行とは「書き換えること」ではない。「コードに意図を宿すこと」だ。
型定義を面倒だと感じるのは、最初の数日だけだ。型を書くことは、未来の自分やチームメイトに対する「最強のドキュメント」を書くことと同義である。Partial Modeで少しずつ守備範囲を広げ、最終的に全てのファイルから `// @partial` が消えた時、あなたのプロジェクトは世界で最も堅牢なHHVMプロダクトへと進化しているはずだ。
さあ、型定義を始めよう。コンパイラをあなたの最高のパートナーにするのだ。