やあ。Hackの世界へようこそ。私はHHVMのコアアーキテクチャを長年見守ってきた者だ。
PHPの「配列(`array`)」という、何でも入る魔法の箱のような柔軟性に慣れていると、Hackの厳格なコレクション型への移行は、時に窮屈に感じられるかもしれない。だが、断言しよう。この「窮屈さ」こそが、あなたのコードをバグという名の崩壊から守る最強の盾となるんだ。
今日は、PHPの配列から`Vector`や`Map`へ移行する際に、単なる書き換え以上の「本質的な意味」を理解するためのガイドを執筆する。さあ、一緒にHackの深淵を覗いてみよう。
—
1. なぜ「配列」を捨てるのか?:メモリと安全性の真実
PHPの配列は、実は「順序付きマップ」「ハッシュテーブル」「リスト」が融合した、非常に複雑な構造体だ。便利だが、メモリ使用量も予測しづらく、何が入っているか実行するまで分からない。
一方、Hackのコレクション(`vec`, `dict`, `keyset`)は、HHVMのエンジンレベルで最適化されている。
- `vec
` : 連続するメモリ領域を確保する。インデックスアクセスが爆速だ。 - `dict
` : 型安全なハッシュテーブル。キーと値の型を固定することで、実行時のチェックコストを最小化できる。
これらに移行することは、コードの「型」という設計図を明確にし、HHVMに「このメモリ領域にはこの型のデータしかない」と確約することに他ならない。
—
2. 段階的移行の戦術:まずは「Shape」から始めよう
いきなり全てをクラスベースのコレクションに変える必要はない。まずは「データ構造を固定する」ことから始めよう。
ステップ1:連想配列を `shape` で囲う
PHPの連想配列を移行する際、最も強力な武器が `shape` だ。
// PHP風の配列(危険!)
$user = [‘name’ => ‘Alice’, ‘id’ => 1];
// Hackの型安全な shape 定義
type User = shape(‘name’ => string, ‘id’ => int);
function processUser(User $user): void {
// もし ‘email’ にアクセスしようとしても、Hackの型チェッカーが即座にエラーを出す
echo $user[‘name’];
}
コツ: 「何が入っているか」を `shape` で定義するだけで、IDEの補完が効き、実行時エラーをコンパイル時に潰せるようになる。これが移行の第一歩だ。
—
3. `vec` と `dict` への移行:ここが分かれ道
PHPの `array` からの移行先は、基本的には以下の3つだ。
1. `vec
2. `dict
3. `keyset
陥りやすいエラー:型推論の罠
初心者がやりがちなミスを見てみよう。
// エラー例
$list = vec[]; // vec
$list[] = “hello”; // vec
// 困る例:空の配列を渡すとき
function process(vec
// これだと型エラー!
process([]);
// 正解:明示的に vec[] と書くか、型を明示する
process(vec[]);
知見: Hackの型チェッカーは非常に賢いが、初期状態が「空」の場合、境界を決められないことがある。明示的な型指定は、コードに対するあなたの「意志」だ。決してサボってはいけない。
—
4. パフォーマンスの極意:Copy-on-Writeと不変性
HHVMのコレクションは「不変(Immutable)」を重視する設計になっている。
PHPの配列は代入のたびにコピーが発生しがちだが、Hackの `vec` や `dict` は、HHVMの内部構造によって効率的にメモリを管理している。
- 変更する時は新しく作る: `vec` に対して `append` する際は、古いものを変更するのではなく、新しいインスタンスを生成する。一見非効率に見えるが、HHVMはこれを「構造共有」という技術で驚異的な速度で処理する。
- 副作用を排除する: コレクションを関数に渡すとき、中身が書き換えられる心配がない。これは大規模開発において、デバッグ時間を劇的に短縮する。
—
5. まとめ:Hackのコードは「ドキュメント」である
PHPの配列は「何が入っているか」をコメントに書かなければならないが、Hackのコレクションはコードそのものがドキュメントだ。
- `dict
` と書いてあれば、誰がどう見ても「文字列をキーに、数値を値に持つマップ」だと分かる。 - この厳格さが、数年後のあなた自身を助けることになるんだ。
ここをクリアすれば、あなたはもうただのPHPユーザーではない。Hackの堅牢なエコシステムを操るエンジニアだ。
もし何か分からないことがあれば、いつでも聞いてほしい。型チェッカーと戦う君の健闘を祈っているよ。さあ、次はどのコードを `vec` に書き換えてみようか?