запуск минимального приложения с 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"
    }
}

источник/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/"]}

Команда Run:

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

У меня установлен hhvm v 4.83.1


person reactor    schedule 16.11.2020    source источник


Ответы (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 является незаконным. Если вы поместите этот код в свой файл 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().


Я только что заметил обновленный README на hhvm-autoload, где действительно было hh_autoload.hh поэтапно прекращено, и вам нужно самостоятельно создать карту автозагрузки (выделено мной):

Замените любые ссылки на vendor/autoload.php на vendor/autoload.hack и вызовите Facebook\AutoloadMap\initialize()

person concat    schedule 18.11.2020