2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Hack and HHVMAdvent Calendar 2018

Day 10

Hackを使いこなす .hhconfig達人への道

Posted at

.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のライブラリの補完について

.hhconfig
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にしておくのをオススメします。

.hhconfig
safe_array = true

deregister_php_stdlib

Hackのhhiファイルなどに <<__PHPStdLib>> と書かれている関数がいくつもあります。
主にPHPで利用されている関数です。
これを有効にするとこれらの関数が利用できなくなります。
デフォルトはfalse

.hhconfig
deregister_php_stdlib = false

user_attributes

Hackのアノテーション / Attributesに関するものです。
__ から始まるものはHackであらかじめ用意されているものですが、
それが以外のものは開発者が自由に作ることができます。
これはプロジェクト内で独自アノテーションを利用する場合に、
開発者が作る・使うものを明記することでそれ以外のものの混入を防いだり、勝手にたくさん作られるのを制御できます。

下記の様にuser_attributesで空文字指定すると、
開発者が独自アノテーションを作ることはできません。

.hhconfig
user_attributes = 

次の例の通りに記述すると、 <<Hoge>> は使うことができますが、
それ以外の独自アノテーションは利用できません。

.hhconfig
user_attributes = Hoge

disallow_return_by_ref

参照渡しの返却を許可するかどうかの設定です。
デフォルトはfalseですが、
trueにすると前回紹介した xhp-lib / (初めてのXHP,
初めてのXHP Tutorial / XHPとReact
) が引っかかってエラーが発生します。

.hhconfig
disallow_return_by_ref = true

ちなみにHackで参照渡しで返却したい場合は、下記の書き方です。

  public function &returnReferenceArray(): array<string, string> {
    return [];
  }

あたまに &

ignored_paths

特定のファイルを完全に無視するようにするためのものです。
このオプションには、正規表現の配列が含まれています。
たとえば、 ignored_paths = ["vendor /. tests?/"]* というようになります

.hhconfig
ignored_paths = ["vendor /.* tests?/"]

今回取り上げたのは一部だけですが、
みなさんの環境であれ?!って思ったら .hhconfig を確認しみましょう!

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?