【入門編】HSLのJSON操作:PHPのjson_decodeの戻り値の曖昧さを型で解決する – Hack言語 コア・静的型システムとHHVMのアーキテクチャ解析バイブル

やあ。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`を駆使して、コレクション操作の美しさを体感してみよう。

何か行き詰まったら、いつでも型チェッカーの出すエラーメッセージ(それは君を攻撃しているのではなく、救おうとしているサインだ!)を読み解いてみてほしい。君ならできるよ。頑張ろう!

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