1

HHVM 3.9 は、名前付き関数を使用した 3 項ステートメントのファンではありませんがfun()、3.10 以上であればまったく問題ありません。ただし、3.9は具体的な関数から返された名前付き関数を受け入れ、他の関数 ( 3v4l )に渡された名前付き関数を受け入れているため、これは数少ないケースの 1 つであるように思われます。

<?hh
echo ((() ==> fun('strlen'))())('Hello'); // 5
echo (($f, $v) ==> $f($v))(strlen, 'Hello'); // 5 + Notice: Use of undefined constant strlen - assumed 'strlen'
echo (true ? strlen : intval)('100'); // Fatal error: syntax error, unexpected '(', expecting ',' or ';' on line 3

3.9 と 3.10 の間で何が変わったのですか? HHVM ≥3.10 で、名前付き関数をこの方法で参照および使用できない場合はありますか?

4

1 に答える 1

1

まず、Hack を書くときは、トップレベルでコードを書かないでください。タイプチェッカーはhh_clientトップレベルでは何もチェックできません。また、3v4l はタイプチェッカーをまったく実行しないため、ローカルで実行する必要があります。

とはいえ、いいえ、Hack には実際にはファーストクラスの機能はありません。ここでの動作のほとんどは PHP から継承されていますが、PHP にもそれらはありません。私が Hack チームで働いていたとき、言語に追加するための多くのアイデアが飛び交いました。それは明らかな追加であり、必要です。しかし、型システムとランタイムの両方の意味合いについて、じっくりと検討を重ねるほど必要性が高まったことはありませんでした。特に、現在の callable が持つスコーピングの問題のいくつかを解決する方法。匿名関数は、特にHack の短いラムダ構文を使用することで、必要性を十分に満たします。

したがって、Hack には PHP の通常の呼び出し可能形式しかありません。funは、指定した文字列が実際に関数を表すという情報をタイプチェッカーに提供する数少ない特別な関数の 1 つです。これにより、タイプチェッカーは適切な型分析を行うことができます。しかし、結局のところfun、通常の PHP 呼び出し可能フォームに、タイプチェッカーに少し追加の魔法を加えたものになります。

3v4lリンクで示した動作について。strlenand like を使用するとintval、Hack で型エラーが発生します。これらは構文的に定数ですが、Hack にはファーストクラスの関数がないため、これらの名前の定数は存在しないためです。または、コードがトップレベルになく、タイプチェッカーを実行していました。HHVM 3.9 で解析エラーが発生する理由 (3.10 で見られる「無効な定数」エラーをマスクする) については、100% 確信が持てません。PHP7 と HHVM 3.10 では機能するが、PHP5 と HHVM 3.9 では機能しないこの例から判断すると、これは後方互換性がある PHP7 の機能であり、常に HHVM で有効になっていると思います。

于 2016-05-14T10:54:04.867 に答える