首页 > 解决方案 > 使用 xhp-lib v4 和 hhvm v 4.81.1 运行最小应用程序会引发错误

问题描述

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

\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}

设置:

作曲家.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

标签: phphhvmhacklang

解决方案


我认为您遇到了这样一个事实,即 hhvm-autoload 没有赶上最近对顶级代码的限制。特别是,require_once顶级似乎不再允许使用 where。使用你的hh_autoload.json,hhvm-autoload 生成这个hh_autoload.hh

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

我认为这require_once是非法的。如果将此代码放在 main 中,它应该可以工作。我在 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

另请注意,现在所有渲染都与 XHP-lib 异步,因此您不能直接echo使用 XHP 对象;反而:

调用$xhp->toString()需要更新为$xhp->toStringAsync().


我刚刚注意到hhvm-autoload 上的更新自述文件,其中确实hh_autoload.hh已被逐步淘汰,您需要自己生成自动加载映射(强调我的):

vendor/autoload.php替换对with 的任何引用vendor/autoload.hack 并调用Facebook\AutoloadMap\initialize()


推荐阅读