.hhconfig
Hackは、単純に <?hh // strict
を記述したHackのファイルを用意するだけではなく、
.hhconfig
ファイルをプロジェクトのルートに作成しなければなりません。
このファイルは自動で作られるものではない、というのを忘れずに覚えておきましょう。
このファイルは主にTypechckerのためのもので、
Typecheckerが型チェックを行う場合に、プロジェクト全体のコードを分析するわけですが、
この時、アプリケーションのプロジェクトルートはどこか、というのを教えるために設置する必要がある、ということです。
最近のHackはバージョンアップで記法や型周りで変更が入ることもあり、
.hhconfigで一部だけTypecheckerの振る舞いを変更したり、
実装コードに対して厳格にチェックする様にしたり、と
アプリケーション開発時に結構重宝することが多いです。
.hhconfigファイルを作ればいいだけ、という情報は 古すぎる情報 なので、
しっかりと覚えましょう。
今回はHackの達人になりたい方むけに .hhconfig でよく使われるものを解説していきましょう
assume_php
PHPファイルを混入させて使うかどうかの設定です。
今現在はHackのコードの中にPHPのコードが混入するのを想定し、デフォルトはtrueになっています。
Hackのみで開発する場合は不要なので、必要がなければfalseで良いです。
ただしこれがtrueになっていてもPHPライブラリがHackのコードに入る場合は、
strictにすることはできません。
今後HHVM自体でもHack環境のみになっていくため、
ライブラリ、フレームワークを作って公開する場合は false にしておきましょう。
どうしてもPHPのライブラリなどを混ぜて利用したい場合は、hhiファイルを作成して、
hh-autoloadに取り込んでください。 PHPのライブラリの補完について
assume_php=false
safe_vector_array / safe_array
strictモードでは利用できませんが、
arrayの <_>
と <_, _>
の混入についてですね。
fooの引数にただの配列が指定されていますが、
内部でコールしているメソッドの引数の配列が異なっています。
これを良しするかどうかです。
デフォルトでは良しとしないことになっています(true)
public function foo(array $data): void {
$this->bar($data);
$this->baz($data);
}
public function bar(array<string> $data): void {
$this->baz($data);
}
public function baz(array<int, string> $_): void {
}
不具合の原因にも繋がりますので、
PHPから移行途中のコードや、昔のHackのコードを動かす場合、
といったケース以外はtrueにしておくのをオススメします。
safe_array = true
deregister_php_stdlib
Hackのhhiファイルなどに <<__PHPStdLib>>
と書かれている関数がいくつもあります。
主にPHPで利用されている関数です。
これを有効にするとこれらの関数が利用できなくなります。
デフォルトはfalse
deregister_php_stdlib = false
user_attributes
Hackのアノテーション / Attributesに関するものです。
__
から始まるものはHackであらかじめ用意されているものですが、
それが以外のものは開発者が自由に作ることができます。
これはプロジェクト内で独自アノテーションを利用する場合に、
開発者が作る・使うものを明記することでそれ以外のものの混入を防いだり、勝手にたくさん作られるのを制御できます。
下記の様にuser_attributesで空文字指定すると、
開発者が独自アノテーションを作ることはできません。
user_attributes =
次の例の通りに記述すると、 <<Hoge>>
は使うことができますが、
それ以外の独自アノテーションは利用できません。
user_attributes = Hoge
disallow_return_by_ref
参照渡しの返却を許可するかどうかの設定です。
デフォルトはfalseですが、
trueにすると前回紹介した xhp-lib / (初めてのXHP,
初めてのXHP Tutorial / XHPとReact) が引っかかってエラーが発生します。
disallow_return_by_ref = true
ちなみにHackで参照渡しで返却したい場合は、下記の書き方です。
public function &returnReferenceArray(): array<string, string> {
return [];
}
あたまに &
ignored_paths
特定のファイルを完全に無視するようにするためのものです。
このオプションには、正規表現の配列が含まれています。
たとえば、 ignored_paths = ["vendor /. tests?/"]* というようになります
ignored_paths = ["vendor /.* tests?/"]
今回取り上げたのは一部だけですが、
みなさんの環境であれ?!って思ったら .hhconfig を確認しみましょう!