やあ。Hackの世界へようこそ。
私はHHVMの深淵で、日々型チェッカーと戯れているアーキテクトだ。
君が今踏み入れたHackという言語は、単なるPHPの進化系ではない。堅牢な型システムとHHVMという高速な実行エンジンが融合した、極めて高度な「エンジニアリングの要塞」だ。
今日は、その要塞を構成する最も重要な礎石――「Null安全(Null Safety)」について話をしよう。多くのプログラミング言語で悪夢の原因となる`NullPointerException`(あるいはそれに類するエラー)。Hackにおいて、これをどうやって「コンパイル時に撲滅するか」をマスターすれば、君はもう初心者卒業だ。
—
1. Nullとは「空っぽ」ではなく「未知の不確定性」である
多くの言語では、変数は「値」か「Null」のどちらかを持つことができる。だが、Hackの`strict`モードでは、「型」と「Null許容型」を明確に区別する。
例えば、`int`型と宣言したら、それは絶対に`int`でなければならない。そこに`null`をねじ込もうとすれば、型チェッカー(hh_client)が即座に警告を発するはずだ。
<<__EntryPoint>>
function main(): void {
int $age = 10;
// $age = null; // ここでコンパイルエラー!「int型にnullは代入できない」と怒られる
}
これがHackの強さだ。「Nullかもしれないもの」を、コンパイラが許さない。では、どうやって「Nullかもしれない」を扱うのか? それが`?int`(Nullable型)だ。
—
2. Nullable型の正体:?を付ける意味
「値があるかもしれないし、ないかもしれない」という状態を表現するには、型の前に`?`を置く。
function getUserId(): ?int {
// DBから検索して、見つからなければnull、見つかればintを返す想定
return null;
}
この`?int`という型を見た瞬間、君の脳内には「あ、この値はnullかもしれないから、そのまま計算に使ってはいけない」というアラートを鳴らさなければならない。これがHackを掌握する第一歩だ。
—
3. 安全なアンラッピング:is演算子による「型絞り込み」
`?int`型の値から、安全に中身を取り出す(アンラッピングする)にはどうすればいいか?
ここで登場するのが、Hackの強力な武器である`is`演算子だ。
function processUser(?int $userId): void {
// ここでいきなり $userId + 1 をやろうとするとエラーになる
if ($userId is int) {
// このブロックの中では、$userIdは確実にintとして扱われる!
// コンパイラが「お、isでチェックしたからこいつはnullじゃないな」と理解してくれる
echo “ユーザーIDは ” . ($userId + 1) . ” です”;
} else {
echo “ユーザーが存在しません”;
}
}
なぜこれが強力なのか?
これは単なるif文ではない。Hackの型チェッカーは「型絞り込み(Type Refinement)」を行っているんだ。`is int`というチェックを通過したスコープ内では、変数の型が`?int`から`int`へと、静的に昇格(昇格)する。
この仕組みのおかげで、実行時に「Nullだったらどうしよう?」とドキドキしながらコードを書く必要はなくなるんだ。
—
4. 初心者が陥りやすい「罠」
慣れないうちは、こんなコードを書いてしまうことがあるかもしれない。
// ダメな例
function badExample(?int $val): void {
if ($val !== null) {
// これでも動くが、is演算子を使う方がHackらしい(洗練されている)
echo $val + 1;
}
}
`!== null`でもNullチェックはできる。しかし、`is`演算子を使えば、例えば「あるインターフェースを実装しているか?」といったより複雑な型チェックにも応用が効くようになる。今のうちから`is`に慣れておこう。
また、無理やり`null`ではないと断定する`??`(Null合体演算子)や`??=`といった演算子も強力だが、「なぜNullなのか?」という設計の意図を考えず、強引にアンラッピングするのは避けるべきだ。
—
魂のまとめ:型は君のガイドライン
Hackの型システムは、君を縛り付けるためのものではない。「君が書くコードを、実行前に守り抜くための最強の防壁」なんだ。
1. Nullable型(?T)を見たら、まずは「Nullチェックが必要だ」と直感する。
2. is演算子を使って、安全に値を絞り込む。
3. コンパイラと対話し、`hh_client`が何も文句を言わない美しいコードを目指す。
このサイクルを回せれば、君はもうHackの基礎を掌握したも同然だよ。
次は、ジェネリクスや不変性(Immutability)の世界へ踏み込んでみないか? そこには、さらなるエンジニアリングの悦びが待っているはずだ。
またいつでも聞きに来てくれ。君のコードが堅牢なものになることを、HHVMの深淵から応援しているよ。