【入門編】PHPの配列からHackのVector/Mapへ:型安全なコレクションへの段階的移行戦略 – Hack言語 コア・静的型システムとHHVMのアーキテクチャ解析バイブル

やあ。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`: インデックス(0, 1, 2…)で管理するリスト。
2. `dict`: キーと値で管理する連想配列。
3. `keyset`: 重複を許さない集合。

陥りやすいエラー:型推論の罠

初心者がやりがちなミスを見てみよう。

// エラー例
$list = vec[]; // vec になる
$list[] = “hello”; // vec に推論が広がる

// 困る例:空の配列を渡すとき
function process(vec $items): void { … }

// これだと型エラー!
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` に書き換えてみようか?

タイトルとURLをコピーしました