【入門編】【初心者向け】PHP配列から`vec`, `dict`, `keyset`への移行:型チェッカーが守るコレクションの整合性 – Hack言語 コア・静的型システムとHHVMのアーキテクチャ解析バイブル

こんにちは!Hack言語の世界へようこそ。チーフアーキテクトの私です。

PHPの柔軟な配列(`array`)に慣れ親しんだ開発者にとって、Hackの厳格なコレクション型(`vec`, `dict`, `keyset`)への移行は、最初は少し窮屈に感じるかもしれません。「なぜあんなに何でも入れられた配列を、わざわざ細かく分けなきゃいけないの?」って思いますよね。

でも、ここをクリアすれば、あなたの書くコードの安全性とパフォーマンスは劇的に跳ね上がります。今回は、Hackの型チェッカーがどのように私たちのコードを守ってくれるのか、その本質を一緒に紐解いていきましょう!ここをマスターすれば、Hackの基本はバッチリですよ。

—

1. PHPの「何でも屋配列」が抱える爆弾

PHPの配列は、文字通り「何でも屋」です。1つの配列の中に、整数、文字列、オブジェクト、果ては別の配列まで、ごちゃまぜに突っ込むことができますよね。

// PHPの配列(自由すぎる世界)
$user = [
“id” => 1,
“name” => “Alice”,
0 => “おまけのデータ”, // キーに数値と文字列が混在
];

一見すると便利ですが、大規模なアプリケーションになると、これが「実行時エラーの温床」になります。
「あれ?ここの配列のキー、本当は文字列の `email` なんだっけ、それとも `mail_address` なんだっけ?」といった些細な勘違いが、本番環境でのクラッシュを引き起こすのです。

これをHHVM(HipHop Virtual Machine)の厳格な型チェッカーでビシッと管理し、コンパイル(型チェック)の段階でバグを根絶やしにするのが、Hackのコレクション型なのです。

—

2. Hackの3つの精鋭コレクション:`vec`, `dict`, `keyset`

Hackでは、PHPの配列を役割に応じて次の3つに明確に分離します。イメージ図と一緒に見てみましょう。

[ PHPの配列 ] ──(分身の術)──> ┌ vec : 順番が命!同種データのリスト
├ dict : キーと値のペア!連想配列
└ keyset : 重複なし!一意な値の集合

それぞれの特徴と基本的な使い方を、コードを交えて優しく解説しますね。

① `vec`(ベクター):順序のあるリスト

要素の「順番」が重要で、同じ型のデータを並べたい時に使います。PHPの「インデックス配列(0, 1, 2…と番号が振られる配列)」の厳格版です。

<<__Strict>>
stdlib;

function print_tags(vec $tags): void {
foreach ($tags as $tag) {
echo $tag.”\n”;
}
}

function main(): void {
// vecのリテラル表現は vec[…] です
// 全ての要素が文字列でなければ、型チェッカーが怒ります!
$my_tags = vec[“Hack”, “PHP”, “HHVM”];

print_tags($my_tags);
}

② `dict`(ディクショナリ):キーと値のペア

いわゆる連想配列です。「キー」と「値」の型をそれぞれ厳格に指定します。

<<__Strict>>

function get_user_info(): dict {
// キーは文字列、値も文字列のペア
return dict[
“name” => “Bob”,
“role” => “Architect”,
];
}

function main(): void {
$user = get_user_info();
// $user[“age”] = 25; // ❌ エラー! 値はstringと定義されているのにintを入れたため
echo $user[“name”].”\n”;
}

③ `keyset`(キーセット):重複のない値の集まり

「ユニークな値だけを保持したい」ときに使います。数学の「集合」と同じで、同じ値が重複して入ることは許されません。

<<__Strict>>

function main(): void {
// 重複した値を入れても、自動的にユニークな集合になります
// 値の型は int または string のみ許可されます
$permissions = keyset[“read”, “write”, “read”];

// 要素数は 2 になります (“read”の重複が消えるため)
echo C\count($permissions).”\n”;
}

—

3. 初めやりがち!型チェッカーに怒られるポイント

Hackを書き始めた頃によくやってしまうミスと、型チェッカーの優しい(?)メッセージの読み解き方をご紹介します。

罠:混雑した配列をそのまま `vec` に入れようとする

<<__Strict>>

function bad_example(): void {
// 整数と文字列が混ざっている!
$data = vec[1, “apple”, 3];
}

型チェッカーの反応:
> Invalid argument: Expected `int` or `string`, got `string` in an `int`-only context… (意訳:おいおい、このvecは全部整数型(int)の予定なのに、途中で文字列(string)を混ぜるなよ!)

解決策:
もしどうしても混在させたい(あるいはレガシーな構造を維持したい)場合は、直球の `vec` ではなく、各要素の型を許容するスーパータイプや形状(shape)を使う設計にシフトします。しかし、基本は「1つのコレクションには1つの型」を守るのがHack流の美しい書き方です。

—

まとめ:型チェッカーはあなたの最高の相棒

いかがでしょうか?
PHPの自由すぎる配列から、`vec`, `dict`, `keyset` への移行は、最初はルールが多くて厳しく感じるかもしれません。

ですが、これはHHVMという巨大なエンジンが、あなたのコードの安全性を裏で完璧に担保してくれている証拠です。「型チェッカーが何も言わずにコンパイルを通したなら、そのデータ構造は100%安全である」——この確信こそが、大規模開発における最大の武器になります。

ここをクリアしたあなたは、もう立派なHackエンジニアの一歩を踏み出していますよ。自信を持って、厳格で美しいコードを書き進めていきましょう!

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