hhvm issues \nFatal error: Uncaught Error: unknown class xhp_x__element in :\nStack trace:\n#0 /Users/user/code/xhp-js-example/example.php(12)

hhvm issues \nFatal error: Uncaught Error: unknown class xhp_x__element in :\nStack trace:\n#0 /Users/user/code/xhp-js-example/example.php(12)

我正在尝试使用 xhp,我发现 运行宁我能找到的一个 xhp 示例 https://github.com/hhvm/xhp-js-example is issuing an error \nFatal error: Uncaught Error: Found top-level code in :\nStack trace:\n#0 {main} when following the README as is on HHVM 4.71. Removing require_once(__DIR__.'/vendor/autoload.php'); resolves the top-level code error but I'm now stuck with the error \nFatal error: Uncaught Error: unknown class xhp_x__element in :\nStack trace:\n#0 /Users/user/code/xhp-js-example/example.php(12): <unknown>()\n#1 {main}. I've tried to change the code in example.php to the one found here:

class :introduction extends :x:element {
  protected function render(): \XHPRoot {
    return <strong>Hello!</strong>;
  }
}

class :intro-plain-str extends :x:element {
  protected function render(): \XHPRoot {
    // Since this function returns an XHPRoot, if you want to return a primitive
    // like a string, wrap it around <x:frag>
    return <x:frag>Hello!</x:frag>;
  }
}
echo <introduction />;
echo PHP_EOL.PHP_EOL;
echo <intro-plain-str />;

因为那行不通,我还尝试了 here 中的简单示例:

<?hh // strict
$user_name = 'Fred';
echo <tt>Hello <strong>{$user_name}</strong></tt>;

但更改为通过将其包装在函数中并按如下方式注释来解决顶级错误:

<?hh // strict

<<__EntryPoint>>
function main(): void {
  $user_name = 'Fred';
  echo <tt>Hello <strong>{$user_name}</strong></tt>;
}

我会得到一个非常相似的错误 \nFatal error: Uncaught Error: Class undefined: xhp_tt in /Users/user/code/xhp-js-example/example.php:6\nStack trace:\n#0 (): main()\n#1 {main}

任何帮助使这些看似简单的示例工作的帮助将不胜感激,因为在基本示例似乎没有 运行 的情况下尝试这种技术是非常痛苦和令人沮丧的。这是在 Catalina 上使用 hhvm 的 macos 包。

编辑:我也在不使用 xhp-js 的情况下尝试过此操作,它包含在示例存储库中,但我收到了相同的错误消息。

OP 在获得 XHP 运行 HHVM 4.62 时遇到了一些障碍,如评论中所述。

  1. xhp-js and xhp-js-example 都过时了几年,因此由于对 HHVM 本身的重大更改,它们无法编译,正如 OP 所见。
  2. 虽然 XHP 语法内置于 Hack 中,但所有标准实现均由 xhp-lib 提供,因此需要自动加载以使用标签和标签的标准库 类 .
  3. HHVM 4.62 的新增功能是 mandatory FIXME whitelisting, which requires package writers to explicitly specify allowed HH_FIXME codes in the .hhconfig. These were added to XHP-lib in 4.0.0rc1,因此当 运行 在 HHVM 4.62 上时,此版本是必需的。

因此,在 4.62 上使用 XHP 的最小项目如下所示:

composer.json

{
  "require": {
    "hhvm": "~4.62",
    "hhvm/hhvm-autoload": "^3.1.3",
    "facebook/xhp-lib": "~4.0.0rc1"
  }
}

hh_autoload.json

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

src/example.hack

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