【入門編】dynamic型とmixed型の戦略的使い分け:完全静的化までの過渡期における型境界の封じ込め – Hack言語 コア・静的型システムとHHVMのアーキテクチャ解析バイブル

やあ。Hackの世界へようこそ。君が今、レガシーなPHPの荒波から、静的型付けという「堅牢な大地」へ船を漕ぎ出そうとしていることを、心から歓迎するよ。

Hackの真髄は、単に型を書くことじゃない。「どこまでを型に委ね、どこからを信頼の境界線とするか」という戦略的思考そのものにあるんだ。今日は、最も多くの開発者がつまずく『dynamic』と『mixed』の使い分けについて、核心を突いていこう。

—

1. 境界線の正体:なぜ「型」が必要なのか

まず、君が触れているPHPコードは、言わば「何が入っているか分からない箱」だ。Hackの型チェッカー(HHVMの心臓部)は、その箱の中身を厳格に検査しようとする。しかし、移行期には全ての箱の中身を即座に特定するのは不可能だよね。

ここで登場するのが、`mixed` と `dynamic` という2つの「免罪符」だ。だが、これらは決して「逃げ道」ではない。「型境界(Type Boundary)」を制御するための精巧なツールなんだ。

—

2. mixed vs dynamic:決定的な違い

初心者ほど、この2つを混同して「とりあえず型エラーが出ないようにする」ために使ってしまう。それは危険だ。

A. `mixed`:厳格な「未知」

`mixed` は、「何が入ってくるか分からないが、使う前には必ずチェックせよ」というコンパイラからの警告だ。

function process(mixed $input): void {
// $input は未知なので、そのままでは何もできない
if ($input is int) {
// ここで初めて int として安全に扱える
print $input + 1;
}
}

  • 用途: 外部からの入力、まだリファクタリングが及んでいない古い関数からの戻り値。
  • 哲学: 「型安全の最前線」。実行時に型を絞り込む(Type Refinement)ことを強制する。

B. `dynamic`:甘美な「罠」

`dynamic` は、「この値は型チェックを無視してくれ。責任は俺が持つ」という最強の権限だ。

function legacy_bridge(dynamic $data): void {
// 型チェックは一切働かない
// メソッドが存在しなくても実行するまで分からない
$data->nonExistentMethod();
}

  • 用途: 移行期において、どうしても修正が困難なレガシーコードとの接続点。
  • 哲学: 「型安全の放棄」。これを多用すると、Hackの恩恵はゼロになる。

—

3. 戦略的移行:型カバレッジを向上させる「封じ込め」

移行期における黄金律は、「`dynamic` を外縁部に追いやる」ことだ。

ステップ1:入り口を `mixed` で受ける

外部からのデータは、まず `mixed` で受け取り、バリデーション関数を通して具体的な型へ変換する。これを「型を剥く」と呼ぶ。

ステップ2:内部は「純粋な型」で満たす

アプリケーションのロジック層には、決して `mixed` や `dynamic` を持ち込んではいけない。関数のシグネチャを `int`, `string`, あるいは独自の `shape` や `class` に書き換えていく。

ステップ3:`dynamic` は「最後の砦」として隔離する

もし外部ライブラリが型定義を持っていない場合、そこだけを `dynamic` でラップし、他のロジックに波及させないようにする。

—

4. よくある失敗:こんなコードは書いてはいけない

初心者がやりがちな「アンチパターン」を紹介するよ。

// 悪い例:どこでも dynamic を使ってしまう
function calculate(dynamic $a, dynamic $b): dynamic {
return $a + $b;
}

これはPHPで書くのと何も変わらない。Hackの型システムは、このコードを「何も見ていない」と判断する。結果、実行時に `null` や `string` が混入してシステムがクラッシュする。

正しい姿勢:
「型が分からないなら、まずは `mixed` にし、そして `is` 式で型を確定させる」。この一手間が、君のコードを100倍堅牢にするんだ。

—

最後に:君へのエール

型システムを学ぶことは、最初は窮屈に感じるかもしれない。けれど、思い出してほしい。「型エラーは、君が寝ている間にコードのバグを叩き潰してくれる忠実な番犬」なんだ。

`mixed` で守り、`dynamic` で最小限の妥協をし、少しずつ静的型付けの領域を広げていく。このプロセスを繰り返せば、君が手にするのは「修正が怖くない、盤石なコードベース」だ。

ここをクリアすれば、君はもうHackの初心者じゃない。次は、型システムをさらに深く活用する「ジェネリクス」の深淵を覗いてみようか。

分からないことがあれば、いつでも聞きに来るといい。君のコードが、最高品質のHackへ進化することを応援しているよ。

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