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にするのが一番いいでしょう。
現場からは以上です。