【入門編】【初心者向け】Shape型の基本:連想配列の構造を型定義してAPIレスポンスを安全に扱う – Hack言語 コア・静的型システムとHHVMのアーキテクチャ解析バイブル

こんにちは。Hackという言語の深淵へようこそ。

Hackは、PHPという動的な血脈に「厳格さ」という鋼の鎧を纏わせた言語です。今日は、皆さんが現場で最も頻繁に遭遇するであろう「データ構造の迷宮」を、`shape`(シェイプ)という強力な武器で攻略する方法を伝授します。

APIから返ってくるJSON、あるいはデータベースの行データ。これらをただの「連想配列」として扱うのは、Hackの世界では「裸で戦場に立つ」のと同じくらい危険なことですよ。

—

1. なぜ「連想配列」ではいけないのか?

PHP時代からの癖で、連想配列(`dict`)をそのまま使っていませんか?

// 危険な例:中身が何であるか、実行してみるまで誰にも分からない
function processUser(dict $user): void {
echo $user[‘name’]; // もし ‘name’ キーがなかったら?
}

このコード、`$user` にどんなデータが入っているか、型チェッカー(hh_client)は何も教えてくれません。存在しないキーにアクセスすれば、実行時にエラーとなり、システムはクラッシュします。

そこで登場するのが `shape` です。これは「この辞書には、このキーとこの型が、必ず存在する」という契約をコードに刻み込む仕組みです。

—

2. Shape型で「契約」を結ぶ

`shape` を使うと、データの構造を事前に定義できます。これがHackの「Strict Mode(厳格モード)」の真骨頂です。

基本的な書き方

// ユーザー情報の構造を定義
type User = shape(
‘id’ => int,
‘name’ => string,
‘email’ => string,
);

function printUserInfo(User $user): void {
// ここでは $user[‘name’] が存在することが保証されている
echo “ユーザー名: ” . $user[‘name’];
}

この `type` 定義を書いた瞬間、HHVMの型チェッカーはあなたのソースコードを監視し始めます。もし `User` 型として定義したキーを間違えたり、型を違えたりすれば、コンパイル(静的解析)の段階でエラーが出るようになります。

—

3. オプションキー(任意フィールド)の扱い

APIのレスポンスには、「たまにしか入っていないデータ」もありますよね。そんな時は `?` を使って「オプション(任意)」であることを明示します。

type UserProfile = shape(
‘id’ => int,
‘name’ => string,
‘bio’ => ?string, // bioはあってもなくても良い(null許容)
);

こうすることで、`bio` にアクセスする際は「値が入っているか?」を安全にチェックするよう型チェッカーが促してくれます。これがバグを未然に防ぐ「守り」の力です。

—

4. 初心者が陥りやすい「罠」と解決策

Hackを始めたばかりの人が、現場でよくやるミスを共有します。ここを回避できれば、もう中級者の仲間入りですよ。

罠①:定義にないキーを追加しようとしてエラーになる

`shape` は基本的に「定義されたもの以外は許さない」というスタンスです。

// エラー例
$u: User = shape(‘id’ => 1, ‘name’ => ‘Alice’, ‘email’ => ‘a@ex.com’, ‘age’ => 20);
// hh_client: “age” というキーは User 型には定義されていません!

対策: 余計なデータを含めたい場合は、`…` を使って「追加可能」なオープン型にすることもできますが、まずは厳格に定義する癖をつけましょう。

罠②:配列(`array` / `dict`)を直接 Shape にキャストできない

外部からのJSONを `json_decode` すると、最初は `mixed` や `dict` 型になります。これを無理やり `shape` として扱うには、`Shapes::idx` や `Shapes::keyExists` といったユーティリティ関数を使って、安全に値を取り出す必要があります。

—

5. まとめ:型は「ドキュメント」以上の存在

ここまで見てきた `shape` ですが、単なるエラー防止ツールではありません。「コードそのものが仕様書になる」という点が最大のメリットです。

  • 誰かが書いたコードを読み解くとき: `type` 定義を見るだけで、その関数がどんなデータ構造を求めているか一瞬で分かります。
  • APIの仕様が変わったとき: 定義を書き換えれば、修正すべき場所を型チェッカーがすべて洗い出してくれます。

Hackの型システムは、あなたの「意図」をコンパイラに伝えるための対話です。ここをクリアすれば、大規模開発でも怖くありません。

さあ、今日からあなたのコードに `shape` で「契約」を刻み込んでみてください。型があなたの背中を支えてくれる感覚が、きっと分かるはずですよ。

何か詰まったら、いつでも質問してくださいね。皆さんのHackライフが素晴らしいものになることを応援しています!

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