运行 带有 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()
我正在尝试以下设置并收到此错误:
\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
withvendor/autoload.hack
and callFacebook\AutoloadMap\initialize()