やあ。Hackの世界へようこそ。
君がこれまでPHPの「文字列の海」を漂ってきたなら、今日ここで学ぶことは、まるで泥舟から頑丈な鉄の船に乗り換えるような体験になるはずだ。
PHPのPHPDocは、あくまで「コメント」だ。型チェッカーが解釈できなければただのゴミだし、IDEが補完をミスれば実行時エラーで足元をすくわれる。だが、HackのCustom Attributesは違う。これはコンパイラが直接解釈し、HHVMが実行時にそのメタデータを利用する「言語の一部」なんだ。
さあ、PHPDocという不確実な遺物から、型安全なメタプログラミングという「真理」へ移行しよう。
—
1. PHPDocは「願い」、Attributeは「契約」
PHPでは、メソッドの振る舞いを変えるためにDocコメントを使っていたね。
/
- @deprecated
- @param int $id
/
function fetchUser(int $id) { … }
これの何が問題か? 言語がこれを「認識」していないことだ。パーサーを自作しない限り、実行時にこのタグを読み取るのは非常に遅い。
HackのCustom Attributesは、コンパイル時に型チェックの対象になる。「契約(Contract)」なんだ。
Hackでの定義と使用例
まずは、独自の属性を作ってみよう。
namespace App\Attributes;
// 属性を定義する際は <<__Attribute>> を付与する
<<__Attribute(__TargetMethod)>>
final class Deprecated implements \HH\ClassAttribute {
public function __construct(private string $message) {}
}
// 利用側
class UserRepo {
<
public function fetchUser(int $id): void {
// …
}
}
ここで重要なのは、`<<__Attribute(__TargetMethod)>>` というメタメタな指定だ。これにより、この属性を「メソッド以外に付けたらコンパイルエラー」にするという制約を、言語レベルで強制できる。これが「型安全なメタプログラミング」の第一歩だ。
—
2. なぜAttributeへ移行すべきか?(アーキテクチャの視点)
PHPDocから移行すべき理由は3つある。
1. 静的解析の完全な統合: HHASTやHackの型チェッカーは、Attributesをネイティブにサポートしている。Docコメントを解析する高コストな「リフレクション」を回す必要はない。
2. 実行速度(HHVMの恩恵): HHVMはコードをマシンコードへJITコンパイルする際、属性情報を最適化のヒントとして利用できる。
3. 型安全なメタデータ: 属性のコンストラクタには型制約がある。`@param` に適当な文字列を書くのと違い、属性はコンパイル時に不正な引数を弾く。
—
3. 移行で陥りやすい「罠」
初心者がよくやる失敗を挙げておくよ。ここを回避すれば、君はもう中級者の入り口だ。
罠①:属性の「名前空間」を忘れる
PHPDocは文字列だからどこに書いても(最悪、typoしても)無視されるだけだが、Attributesはクラスだ。必ずインポートするか、完全修飾名で書く必要がある。
- ダメな例: `<
>` (クラスが見つからない) - 良い例: `<<\App\Attributes\Deprecated("...")>>`
罠②:リフレクションのタイミングを履き違える
Attributesは「コードを実行するためのメタデータ」だ。HHVMの `ReflectionMethod::getAttributes()` を使って取得するが、ここで取得できるのは「型安全に定義されたオブジェクト」であるという点を忘れないでほしい。
// 属性の中身を取り出す例
$method = new ReflectionMethod(‘UserRepo’, ‘fetchUser’);
$attrs = $method->getAttributes(\App\Attributes\Deprecated::class);
foreach ($attrs as $attr) {
$instance = $attr->newInstance();
echo $instance->message; // 型安全にアクセスできる!
}
—
4. まとめ:君のコードを「言語の一部」にする
PHPDocは、言語の外側に置かれた「申し送り事項」だ。しかし、Attributesを使うことで、君の書いたコードは「言語の機能そのもの」へと昇華する。
Hackの型システムは、君に「曖昧さを許さない」ことを求めてくる。最初は窮屈に感じるかもしれない。しかし、その「窮屈さ」こそが、大規模開発において実行時エラーをゼロに近づけるための、世界最高峰の武器なんだ。
ここをクリアすれば、君はもうPHPDocの脆弱な世界には戻れなくなるはずだ。
次は、`HSL(Hack Standard Library)` を使って、この属性をどうやって効率的にルーティングやDIコンテナに活用するか……その深い話へ進もうか。準備はいいかな?