【入門編】PHPのグローバル変数からの脱却:Hackの型システムによる依存関係の注入 – Hack言語 コア・静的型システムとHHVMのアーキテクチャ解析バイブル

やあ。Hackの世界へようこそ。
君がいまPHPの「カオスなグローバル変数」という名の沼から抜け出し、Hackの堅牢な型システムという聖域へ足を踏み入れようとしていること、心から歓迎するよ。

PHPの `$GLOBALS` や `global` キーワードは、一見便利そうに見える。しかし、それは「どこで誰が値を書き換えたか分からない」という時限爆弾を、アプリケーション全体にばら撒いているのと同じなんだ。

今日は、Hackの厳格な型システムを武器に、その爆弾を解体し、依存関係を美しく制御する方法を伝授しよう。ここを乗り越えれば、君の書くコードは「予測可能で、壊れない」ものへと進化する。

—

1. なぜグローバル変数は「敵」なのか

グローバル変数を使っているとき、関数はこう叫んでいる。
「私は誰が用意したか分からない、どんな型か確信が持てないデータに依存している!」

これは、型チェッカー(HHVM)にとっても悪夢だ。型が静的に確定しない以上、実行時にエラーが起きるリスクを排除できない。Hackの哲学は「実行時の驚きをゼロにする」ことにある。そのためには、依存関係を「隠す」のではなく「明示」しなければならない。

—

2. 依存関係の注入(DI):明示という名の救済

グローバル変数に頼るのをやめ、「必要なものはコンストラクタで受け取る」。これが基本原則だ。

悪い例:グローバルに依存するコード

// どこかで定義されたグローバル変数
// 誰が書き換えたか、何が入っているか不明瞭
function process_user(): void {
global $db;
// $dbがnullかもしれないし、別のオブジェクトかもしれない
$db->query(“…”);
}

良い例:DIを用いたHackらしいコード

interface IDatabase {
public function query(string $sql): void;
}

class UserProcessor {
// 依存関係を型として明確に定義する
public function __construct(
private IDatabase $db,
) {}

public function process(): void {
// 確実にIDatabaseのインスタンスが保証されている
$this->db->query(“…”);
}
}

ここで重要なのは、`private` プロパティの宣言と同時に型を定義している点だ。Hackの型チェッカーは、このクラスがインスタンス化される瞬間に、`IDatabase` を満たすオブジェクトが渡されているかを厳密にチェックする。これぞ、我々が愛する「静的解析の力」だよ。

—

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

Hackの厳格な型システムに触れ始めると、こんなエラーに遭遇するはずだ。

「`Property … does not have an initializer`」
(プロパティに初期値がないよ、という警告)

  • 解説: Hackはプロパティが「未定義のまま放置されること」を極端に嫌う。コンストラクタで必ず値を代入するか、あるいは nullable (`?T`) であることを明示する必要がある。
  • コツ: `private` プロパティの直後に型を書く書き方(プロモーション)を活用しよう。コードが劇的に短くなり、書き忘れも防げる。

—

4. HSL(Hack Standard Library)でさらなる高みへ

PHPの古い配列操作に依存するのをやめ、HSLを活用しよう。例えば、依存関係を管理するコンテナを作成する際も、`vec` や `dict` といった型安全なコレクションを使うんだ。

use namespace HH\Lib\Dict;

// DIコンテナの簡易イメージ
class Container {
private dict $services = dict[];

public function set(string $id, mixed $service): void {
$this->services[$id] = $service;
}

// ジェネリクスを使って型を安全に取り出す
public function get(string $id): T {
return $this->services[$id] as T;
}
}

※ `as T` はHackにおける強力なアサーションだ。型安全を強制的に保証する最後の砦となる。

—

まとめ:君のコードは、もっと強くなれる

グローバル変数からの脱却は、単なる「行儀の良いコード」への移行ではない。それは、君が書いたコードの「契約(Contract)」を明確にする行為なんだ。

1. 隠すな: 依存関係はコンストラクタの引数で宣言する。
2. 型を信じろ: `mixed` ではなく、`interface` や `shape` で構造を定義する。
3. HHVMを味方に: 型チェッカーが怒るなら、それは君の設計がまだ曖昧だというサインだ。そのサインに感謝しよう。

ここをクリアした君は、もう「ただのPHPエンジニア」ではない。Hackの堅牢さを理解した、アーキテクトへの第一歩を踏み出したんだ。

さあ、エディタを開いて、そのグローバル変数を一つだけDIに置き換えてみよう。その一歩が、巨大なアプリケーションを安定させる礎になるはずだよ。

応援しているよ。何か詰まったら、いつでも型チェッカーの出す「真実のメッセージ」に耳を傾けてみてくれ。

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