2016-05-12 14 views
1

HHVM 3.9は、fun()に渡されたとしても、名前付き関数を持つ3つのステートメントのファンではありませんが、≥ 3.10は完全に問題ありません。ハックは完全にファーストクラスの市民として機能していますか?

<?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 するという名前の関数は、具体的な機能だけでなく、他の機能(3v4l)に渡された名前の関数を受け入れることから返さ受け入れないので、これは、しかし、いくつかのケースの一つであるかのように思えます3.9および3.10? HHVM ≥ 3.10で名前付き関数をこのように参照して使用できない場合がありますか?

答えて

1

まず、Hackを書くときは、don't write your code at toplevel; the hh_client typechecker can't check anything at toplevelです。 3v4lは型チェッカーをまったく実行しないので、ローカルで実行する必要があります。

つまり、いいえ、ハックは実際にファーストクラスの機能を持っていません。 PHPの動作の大部分はPHPから継承されていますが、PHPもこれを持っていません。私がHackチームで働いていたとき、私たちはそれらを言語に追加するためのたくさんのアイデアを捨てました。それは明白な追加と必要です。しかし、必要性は全くありませんかなり私たちが座って、実際にはタイプシステムとランタイムの両方の意味の詳細を演出しました。特に、現在の呼び出し可能ファイルが持つスコープの問題のいくつかを解決する方法。匿名機能は、特にHack's short lambda syntaxで、十分に対処しなければならない何かが必要であることを十分に記入しています。

だから、HackはPHPの通常の呼び出し可能なフォームを持っています。 fun is one of a few special functions which give information to the typechecker that the string you specified actually represents a functionですので、型チェッカーは適切な型分析を行うことができます。しかし、今日の終わりには、funは、通常のPHP呼び出し可能な形式になっています。これは、型チェッカーで少し余分な魔法を使います。

あなたの3v4lリンクでの動作については、 strlenintvalのようなものを使用すると、Hackに型エラーが発生します.Hackには構文上の定数がありますが、Hackにはファーストクラスの関数がないため、これらの名前の定数が存在しないためです。あなたは型チェッカーを実行していました。なぜそれがHHVM 3.9(3.10で見られる "無効な定数"エラーを隠す)で解析エラーを引き起こすかについては、私は100%確信していません。 this example(PHP7とHHVM 3.10では動作するが、PHP5とHHVM 3.9では動作しない)から判断すると、PHP7 feature that is backwards compatible and so is always enabled in HHVMと思われる。

+0

ああ、これは_PHP7_がwrtという名前の関数をサポートしているかどうかという疑問です。私は "Notice ... undefined constant"が "通常のPHP呼び出し可能形式"に変わった場合、なぜfunによって抑制されているのか不思議です。明確にするために:型エラーの外に、 'fun( 'foo')'と 'foo'が異なって解釈されるケースはありません。 – concat

+0

タイプエラーは全体のポイントです。彼らは強調して型チェッカーで同じではありません。しかし、[実行時に、はい](https://github.com/facebook/hhvm/blob/cc7f35361e5dfc934631e1e19e2f2b9f66890391/hphp/system/php/lang/fun.ns.php#L31-L67)。編集:私がリンクしているコードのコメントはトップレベルにあるので、間違っていますが、[通常の公開ドキュメント](https://docs.hhvm.com/hack/callables/special-functions)は正しいです。 –

関連する問題