运行 带有 xhp-lib v4 和 hhvm v 4.81.1 的最小应用程序抛出错误

running minimal app with xhp-lib v4 and hhvm v 4.81.1 throws error

我正在尝试以下设置并收到此错误:

\nFatal error: Uncaught Error: Found top-level code in /home/user/code/xhp-simple/src/example.php:7\nStack trace:\n#0 (): main()\n#1 {main}

设置:

composer.json

{
    "require": {
        "hhvm/hhvm-autoload": "^3.1",
        "facebook/xhp-lib": "^4.0"
    }
}

src/index.hack

use type Facebook\XHP\HTML\div;
//  require_once(__DIR__."/../vendor/hh_autoload.hh");  // also tried here instead of in main

<<__EntryPoint>>
function main(): void {
  require_once(__DIR__."/../vendor/hh_autoload.hh");
  echo <div>{1 + 2}</div>;
}

hh_autoload.json

{"roots": ["src/"]}

运行 命令:

hhvm -m server -p 8080 -d hhvm.server.default_document=./src/example.hack

我安装了 hhvm v 4.83.1

我认为您 运行 了解 hhvm-autoload 没有跟上最近对顶级代码的限制这一事实。特别是,require_once 似乎不再被允许出现在顶层。使用您的 hh_autoload.json,hhvm-autoload 会生成此 hh_autoload.hh:

<?hh // partial
require_once(__DIR__.'/autoload.hack');
Facebook\AutoloadMap\initialize();

我认为 require_once 是非法的。如果您将此代码放在主程序中,它应该可以工作。我在 HHVM 4.84.0 上测试没有问题:

// src/index.hack
use type Facebook\XHP\HTML\div;

<<__EntryPoint>>
async function main(): Awaitable<void> {
    require_once(__DIR__.'/../vendor/autoload.hack');
    Facebook\AutoloadMap\initialize();
    echo await (<div>{1 + 2}</div>)->toStringAsync();
}
$ # run with:
$ hhvm src/index.hack

还要注意 all rendering is async now with XHP-lib,所以你不能直接 echo XHP 对象;相反:

Calls to $xhp->toString() need to be updated to $xhp->toStringAsync().


我刚刚注意到 the updated README on hhvm-autoload,确实 hh_autoload.hh 已经被淘汰,您需要自己生成自动加载地图(强调我的):

Replace any references to vendor/autoload.php with vendor/autoload.hack and call Facebook\AutoloadMap\initialize()