やあ。HHVMの深淵へようこそ。Hackのコアコミッターとして、君が今PHPからHackの世界へ足を踏み入れようとしていることを歓迎するよ。
PHPの`isset()`や`empty()`は、かつてWebの黎明期を支えた便利な道具だった。しかし、Hackの厳格な型システムにおいては、これらは「型推論を破壊する爆弾」だ。なぜか? それは、これらが「値の存在」と「値の真偽」を曖昧に混ぜ合わせるからだよ。
今日は、Hackで「安全で高速なコード」を書くための、最初にして最大の関門を攻略しよう。
—
1. なぜ `empty()` を使ってはいけないのか?
PHPの `empty()` は、いわゆる「truthy/falsy」という概念に基づいて動く。だが、この判定はあまりに広すぎる。
// PHP的な古い書き方
if (empty($user_input)) {
// ここに何が入ったらこのブロックに入る?
// “”(空文字), 0, “0”, false, null, [] …
}
このコードの何が悪いか? 開発者が「空文字だけを弾きたい」と思っても、`0` まで一緒に握りつぶしてしまう点だ。Hackでは、「何を判定したいのか」を言語に明確に伝えなければならない。
イメージ図:判定の解像度
- PHPの `empty()`: 大雑把なフィルター(小魚も砂も全部網に引っかかる)
- Hackの厳格判定: ピンポイントの選別(型と値で正確に仕分ける)
—
2. Hackの「明示的判定」への転換
Hackでは、「値が存在するか?」「値が何か?」を分離して扱うのが鉄則だ。
A. Nullの判定:Null合体演算子 `??`
変数が `null` かもしれないなら、`isset()` でチェックするのではなく、最初から `?T` (Nullable型) として扱い、`??` でデフォルト値を指定しよう。
// 良い例:Nullable型から安全に取り出す
function get_data(?string $input): string {
// $input が null なら ‘default’ を使う
return $input ?? ‘default’;
}
B. 0や空文字を区別する:明示的比較
`empty()` の魔法に頼らず、比較演算子を正しく使おう。
// 空文字だけを弾きたい場合
if ($input === “”) {
// 0 は通る。これが意図した挙動だね
}
// 数値として0も弾きたいが、nullとは区別したい場合
if ($input is int && $input === 0) {
// ここは0の時だけ実行される
}
—
3. HSL(Hack Standard Library)の活用
HSLは、PHPの標準関数が抱えていた「型安全性の欠如」を解決するために設計されている。特に文字列やコレクションの判定には、HSLのヘルパーを使うのがHack流だ。
例えば、「文字列が空かどうか」を判定するなら、`Str\is_empty()` を使おう。
use namespace HH\Lib\Str;
function process_name(string $name): void {
if (Str\is_empty($name)) {
// 明確に「文字列が空」であることを示せる
return;
}
// …
}
`Str\is_empty()` は内部的に `string` 型専用に最適化されているため、`empty()` のように「配列やオブジェクトが来たらどうしよう」と悩む必要はない。型チェッカーがコンパイル時にそれを保証してくれるんだ。
—
4. 陥りやすい「型推論の罠」
初心者がよくやる間違いは、条件分岐の中で型を絞り込まずに、HHVMの型チェッカーを怒らせることだ。
// 悪い例:型が絞り込めていない
function bad_example(mixed $val): void {
if ($val) { // これもPHP的だがHackでは避けるべき
// $val が int なのか string なのか、型チェッカーは追跡できない
}
}
// 良い例:is 演算子で型を確定させる
function good_example(mixed $val): void {
if ($val is string) {
// ここでは $val は string と確定している!
echo Str\length($val);
}
}
`is` 演算子を使うと、そのスコープ内では変数の型が自動的に昇格(Refinement)される。これがHackの強力な武器だ。
—
まとめ:今日から始めるHackの作法
1. `empty()` は禁止: 自分の意図をコードに書こう。`=== “”` なのか、`=== 0` なのか。
2. `isset()` は `??` に置換: 値が存在しない可能性を型定義(`?T`)で表現し、Null合体で解決する。
3. HSLを味方にする: `Str` や `Vec` などの名前空間にある関数は、型安全性が保証された最強のツールだ。
ここをクリアすれば、君のコードは「動く」だけのものから、「正しさが数学的に証明された」堅牢な資産へと変わるはずだよ。
型チェッカーと対話することは、HHVMという巨大なエンジンと対話することと同義だ。自信を持って、その厳格さを楽しんでほしい。また何かあれば、いつでも聞きに来るといい。