HHVM 4.50リリース!

HHVM 4.50

現地時間3/24に最新のHHVM4.50がリリースされました。
これに伴い4.44のサポートが停止に。
現在サポートされるバージョンはHHVM 4.45–4.49です。
なおLTSは4.8、4.32です。

$ hhvm --version

でHipHop VM 3系が表示される方はもうそのバージョンを使うのは辞めましょう。
かなり別物になっています。

変更点ハイライト

HHHVMのphp.iniに以下のものが追加されました。

hhvm.hack_arr_is_shape_tuple_notices

use function var_dump;

<<__EntryPoint>>
async function mainAsync(): Awaitable<void> {

  $dict = dict['a' => 'c'];
  var_dump($dict is shape());
}

今まではfalseが返却されていましたが、これを実行するとnoticeが発生する様になります。

Notice: Hack Array Compat: dict is shape in path/to/file.hack

もう一つは、Enumについて。
というかこの機能初めてしりました・・・

use function var_dump;

<<__EntryPoint>>
async function mainAsync(): Awaitable<void> {
  $l = new Latest();
  $l->builtinEnum();  
}

class Latest {
  protected vec<arraykey> $vec = vec[];
  public function builtinEnum(): void {
    $this->vec = vec[FOOBAR::BAZ];
    var_dump($this->vec);
  }
}

/* HH_FIXME[2053] */
class FOOBAR extends HH\BuiltinEnum<arraykey> {
  const BAZ = 4;
}

自分でEnumのクラスを作れたんですね・・・。
covariantになった様です。

Breaking Changes

PHPに詳しい方はよりPHPっぽさがなくなるように感じる変更がいくつか。

マジックメソッドの__get, __set, __isset, __unsetがTypecheckerから削除されました。
Typecheckerの特性を考えると当然かもしれません。
これらのマジックメソッドは将来ランタイムからも削除されるそうです。
つまり使えなくなります。

Future Changes

array() リテラルが削除されるそうです。
以前からHack Arrayにないもの(PHP array特有のもの)は削除します、とありましたので、
いよいよ削除されます。

hhvmのpjp.iniに hhvm.hack.lang.disable_array=trueを指定するか、
.hhconfigに disallow_array_literal=true でその挙動に変更できます。

したがって4.50で.hhconfigは以下のモノにしておくと良さそうです。

assume_php = false
enable_experimental_tc_features = no_fallback_in_namespaces
ignored_paths = [ "vendor/.+/tests/.+" ]
safe_array = true
safe_vector_array = true
disallow_assign_by_ref = true
unsafe_rx = false
disallow_array_literal=true

コードを記述してみましょう。

use function var_dump;

<<__EntryPoint>>
async function mainAsync(): Awaitable<void> {
  $l = new Latest();
  $l->disallowPHPArray();  
}

class Latest {

  public function disallowPHPArray(): void {
    var_dump(array(1 => 32));
  }
}

上記のコードを実行すると以下のエラーで実行できなくなります。

Naming[2083] Array literals are no longer legal; use varray or darray instead
   --> index.hack
 15 |     var_dump(array(1 => 32));
    |     

警告に出る様にarrayではなく、darray, varrayなどのHack Arrayにすると回避できます。

    var_dump(darray[1 => 32]);
    var_dump(dict[1 => 32]);

この場合、コレクション的な操作を行ったりするのでdictにするのが一番いいでしょう。

現場からは以上です。