やあ。Hackの世界へようこそ。
君が今、PHPの「動的な泥沼」から抜け出し、Hackの「静的な堅牢さ」という高みに足を踏み入れようとしていることを、一人のアーキテクトとして心から歓迎するよ。
今日は、多くの開発者が最初の壁としてぶつかる「JSONの呪い」を解く方法を伝授しよう。PHPの`json_decode`が返すあの曖昧な`mixed`型(あるいは`array
—
1. なぜPHPの`json_decode`は「悪」なのか
PHPの`json_decode`は、戻り値が`mixed`だ。つまり、データが何であるか実行するまで誰にもわからない。
「キーは存在するのか?」「この値は文字列なのか、それともnullなのか?」という疑心暗鬼に駆られながら、毎回`is_array()`や`isset()`でチェックする……これがPHPの非効率な日常だ。
Hackにおいて、私たちは「データが境界線を越えてきた瞬間」に型を確定させる。これを怠ると、HHVMの最適化エンジンは君のコードを信用できず、本来のパフォーマンスを発揮できない。
—
2. HSLとShapeを使った「型安全なゲートウェイ」
Hack Standard Library (HSL) を使えば、JSONのデコード結果を、君が定義した`shape`に安全に流し込める。
まずは、典型的な「ユーザー情報」を扱うケースを見てみよう。
namespace App;
use namespace HH\Lib\{JSON, Vec};
// 1. まず、データの「形」を定義する。これが君のコードの契約書だ。
type TUser = shape(
‘id’ => int,
‘username’ => string,
‘is_active’ => bool,
);
function process_json_data(string $json_string): TUser {
// 2. JSONをパースする。JSON\decodeはmixedを返すが、ここからが腕の見せ所。
$data = JSON\decode($json_string);
// 3. 型を強制的に合わせる(Refinement)
// 構造が期待通りかチェックし、Shapeにキャストする。
if ($data is shape(‘id’ => int, ‘username’ => string, ‘is_active’ => bool, …)) {
return $data;
}
throw new \Exception(“JSONの構造が期待と異なります”);
}
ここがポイント:
- `shape`: 辞書型(Map)のようなものだが、キーと値の型が固定されている。
- `is`演算子: Hackの型チェッカーは、この`is`を通った後のブロック内では、変数の型を自動的に`TUser`として認識する。これを「型のリファインメント」と呼ぶ。
—
3. よくある落とし穴と解決策
初学者が必ず通る道として、以下の2つを覚えておいてほしい。
① `…` (Open Shape) の罠
`shape(‘id’ => int)` と定義した時、JSONに他のキーが含まれていると、型チェックでエラーになることがある。
もし外部APIなど、余計なキーが含まれる可能性がある場合は、Open Shapeを使おう。
// 末尾に ‘…’ をつけることで、「指定したキー以外があっても許容する」という意味になる
type TUser = shape(
‘id’ => int,
…
);
② ネストされたJSONの扱い
JSONが複雑な場合、全部を一つの`shape`に押し込むと可読性が死ぬ。`type`を分割して階層化するのがスマートだ。
type TAddress = shape(‘city’ => string, ‘zip’ => int);
type TUser = shape(‘name’ => string, ‘address’ => TAddress);
—
4. なぜこれがHHVMにとって「最高」なのか
君が書いたこのコードは、単に「型エラーを防ぐ」だけではない。
HHVMのJIT(Just-In-Time)コンパイラは、`shape`の形状を把握することで、メモリ上のどこにどのデータがあるかを正確に予測できる。つまり、型安全に書くことが、実行速度の最大化に直結するということだ。
PHPのように動的なハッシュテーブルを毎回検索するのではなく、構造体に近いオフセットアクセスが可能になる。これが、Hackが「速い」理由の真髄だ。
—
先輩からのメッセージ
「JSONを信じるな、定義を信じろ」。
これがHackで生き残るための鉄則だ。`json_decode`した瞬間に、そのデータを君の定義した`shape`という「型」の檻に閉じ込める。その手間さえ惜しまなければ、君のコードから `Undefined index` という恐怖は完全に消滅するはずだ。
ここをクリアできれば、君はもうHackの初心者ではない。次は、HSLの`Vec`や`Dict`を駆使して、コレクション操作の美しさを体感してみよう。
何か行き詰まったら、いつでも型チェッカーの出すエラーメッセージ(それは君を攻撃しているのではなく、救おうとしているサインだ!)を読み解いてみてほしい。君ならできるよ。頑張ろう!