PHPの亡霊を葬れ:Hackのコレクション型で実現する「型安全」という名の正義
現場のコードレビューで、未だに `array` を見かけるたびに溜息が出る。
「なんでも入る箱」は、プログラマの怠慢を許容するゴミ箱だ。PHPの配列は、連想配列であり、順序付きリストであり、スタックであり、キューでもある。「すべてになれる」ということは、「何者でもない」ということだ。
HHVMの深淵に触れるアーキテクトとして断言しよう。PHPの配列を使い続けることは、時限爆弾を抱えて本番環境へ突撃するのと同義だ。今日からその悪癖を捨て、Hackの `vec`, `dict`, `keyset` という「真の型」を掌握せよ。
—
1. なぜ「array」を捨てるのか:型システムの重み
PHPの `array` をそのまま使うことは、Hackの強力な静的解析を自ら無効化しているに等しい。`HHVM` の型チェッカー(HHCC)は、`vec
- `vec
` : 順序付きのリスト。PHPの添字配列の代替。 - `dict
` : キーと値の対応表。PHPの連想配列の代替。 - `keyset
` : 一意な値の集合。ハッシュセット。
これらは、実行時の `is_array()` チェックを不要にする。コードの境界で型が保証されているからだ。
—
2. 実践:保守性の高いプロダクションコードの書き方
APIのレスポンスやデータベースのレコードを扱う際、以下のように定義するのが「美しい設計」だ。
namespace App;
/
- プロダクション環境における堅牢なデータ構造の例
/
type UserProfile = shape(
‘id’ => int,
‘username’ => string,
‘roles’ => vec
);
final class UserRegistry {
// dictを使うことで、キーの存在と値の型がコンパイル時に保証される
private dict
public function registerUser(int $id, string $name, vec
// 予期せぬ型が混入する余地がない
$this->users[$id] = shape(
‘id’ => $id,
‘username’ => $name,
‘roles’ => $roles,
);
}
public function getRoleCount(int $id): int {
// dictの恩恵: キーが存在しない可能性を考慮した安全な操作
return $this->users->get($id)
|> $$?[‘roles’]
|> \C\count($$ ?? vec[]);
}
}
このコードがなぜ優れているのか?
1. `shape` の活用: 構造が明確であるため、IDEの補完が効き、キーのタイポもコンパイル時に弾かれる。
2. `vec
3. `pipe` オペレータ (`|>`): 可読性を損なうネストを排除し、処理の流れを一本の線にする。
—
3. パフォーマンスの真実:メモリ管理とコピーの罠
Hackのコレクションは「イミュータブル(不変)」に近い挙動を好む。`vec` に要素を追加する際、PHPの古い配列のように毎回コピーが発生してパフォーマンスが死ぬことを恐れる必要はない。
HHVMのランタイムは、コレクションのコピーオンライト(Copy-on-Write)を高度に最適化している。しかし、巨大なコレクションを不必要にループ内で生成・代入し続けるのは避けるべきだ。
- 避けるべき記述:
// ループ内で毎回vecを生成・マージするのはメモリの浪費
$list = vec[];
foreach ($items as $item) {
$list = vec_concat($list, vec[$item]); // これは最悪
}
- 推奨する記述:
// 必要な分だけメモリを確保する、あるいはイテレータを活用する
$list = vec[];
foreach ($items as $item) {
$list[] = $item; // HHVMが最適化された効率的な追加を行う
}
—
4. 最後に:エンジニアとしての矜持
「厳格モード(Strict Mode)」で開発することは、最初は窮屈に感じるかもしれない。だが、それはあなたが「動くかもしれないコード」ではなく「壊れることのないシステム」を書くための訓練だ。
型チェッカーと戦うな。型チェッカーを信頼し、あなたの設計を助ける強力な相棒として扱え。バグが起きる前に、コンパイラが「お前、そこで型が合っていないぞ」と教えてくれる環境ほど、エンジニアにとって幸福なことはないのだから。
次は、`Awaitable` を使った非同期処理の型安全な連携について語ろう。準備はいいか?
—
Hackの深淵を覗く準備ができたなら、今すぐ `