type holyshared = Engineer<mixed>

PHP、Hack、Ruby、Javascript周りの技術ブログ

PHPのコードをHackのコードに変換する

PHPコードをHackのコードに置き換えるのは、最高に面倒くさいですよね。
なので、HHVMで提供されている、hackificatorを使用して、一気に変換できないかを検証してみました。

hackificatorPHPコードをHackに置き換える為のコマンドラインツールです。
hackificatorOCamlで実装されており、ASTベースでのコード変換を行いまます。(コード読む限り)

試した、HHVMのバージョンは3.12.0です。

置き換えのステップ

置き換えには2ステップ必要です。

  1. PHPのコードをHackのコードに置き換える
  2. Hackのコードをstrictモードにアップグレードする

PHPのコードをHackのコードに置き換える

下記のコマンドで、指定したディレクトリ内のPHPコードをHackのコードに置き換えます。

hackificator -thrift .

変換作業の仕様は試した感じでは下記のようでした。

  • ファイルのヘッダーを<?phpから<?hhに変える。
    • 変換した直後は、partialモードになる(ヘッダーにpartialコメントはつかない)
  • 変換時に型の矛盾などのエラーを検出した場合は変換しない。
  • 拡張子PHPのまま。
  • タイプヒントの型の変換は行わない。
    • PHP7のreturn typeのselfをthisに置き換えたりしない。
  • declare(strict_types=1)があるファイルは変換できない。

Hackのコードをstrictモードにアップグレードする

下記のコマンドで、指定したディレクトリ内のHackコードをstrictモードにアップグレードします。

hackificator -upgrade .
  • アップグレードできるものは<?hh //strictにヘッダーを変える。
  • 型エラーが起きるものは変換しない(partialモード or declモードのまま)。
  • 拡張子はそのまま、.hhの場合は、.hhのまま、.phpの場合は.phpのまま。

まとめ

  • PHP7以降のコードベースでも、すんなりとはHackに移行できなさそう。
  • コードの変換はできるが、Hackらしいコードには変換できない。(当たり前だ)
  • 通常のPHPからHackへの移行は次のようになると思います。
    1. PHPからHackへコードを変える。
    2. 型の指定を変える、型の指定を追加する。
    3. 型のチェックを通す。
    4. strictモードへアップグレードする。(本来のHacklang)