php - 使用 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
解决方案
我认为您遇到了这样一个事实,即 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()
推荐阅读
- html - 你怎么能否定CSS翻译对父溢出的影响
- azure - Azure 静态 Web 应用中 Azure 函数的 CORS
- excel - Excel中的工作表将范围对象数据输出为PDF文件,我希望每个范围都保存为单独的pdf页面?
- javascript - 在 p5.js 画布上旋转和绘图
- r - R矩阵的分位数 - 错误的输出
- ios - 自定义字体未在 Xcode 中显示
- python - 如何在python中的日常整个数据集中将数据框中的值相乘以获得相同的时间戳
- javascript - 纱线 v2 中的 CommitLint
- javascript - 为数组 React 中的单击元素添加 +1
- google-earth-engine - GEE:要素几何的 aoi 的 NDVI 时间序列图