hhvm выдает \nНеустранимая ошибка: необработанная ошибка: неизвестный класс xhp_x__element в:\nТрассировка стека:\n#0 /Users/user/code/xhp-js-example/example.php(12)

Я пытаюсь поиграть с xhp и обнаружил, что запустив единственный пример xhp, я смог найти https://github.com/hhvm/xhp-js-example выдает ошибку \nFatal error: Uncaught Error: Found top-level code in :\nStack trace:\n#0 {main} при следовании README, как в HHVM 4.71. Удаление require_once(__DIR__.'/vendor/autoload.php'); устраняет ошибку кода верхнего уровня, но теперь я застрял с ошибкой \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}. Я попытался изменить код в example.php на тот, который можно найти здесь:

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 />;

поскольку это не сработало, я также попробовал простой пример из здесь:

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

Любая помощь в том, чтобы заставить эти, казалось бы, простые примеры работать, была бы очень признательна, поскольку очень болезненно и обескураживающе пробовать эту технологию, когда кажется, что базовые примеры не работают. это использует пакет macos hhvm на Catalina.

РЕДАКТИРОВАТЬ: я также пробовал это без использования xhp-js, который включен в пример репо, и я получаю то же сообщение об ошибке.


person reactor    schedule 20.08.2020    source источник
comment
Пример, который вы используете, устарел, так как xhp-js очень устарел, последний раз обновлялся в 2017 году. . С тех пор в Hack было внесено много критических изменений, поэтому мы даже не можем скомпилировать последний xhp-js как есть. Если вы просто хотите увидеть работу XHP, попробуйте этот пример в документах. Как вы заметили, вы должны требовать xhp-lib как библиотеку (через автозагрузку), поскольку она предоставляет все определения тегов и еще много чего.   -  person concat    schedule 21.08.2020
comment
Я пробовал это без xhp-js и, к сожалению, получаю ту же проблему. Я обновлю исходный пост, чтобы отразить, что я пробовал это и без xhp-js.   -  person reactor    schedule 21.08.2020
comment
Ах, я пропустил тот факт, что вы использовали более простые примеры. В этих примерах с удаленным xhp-js и всем кодом в функции точки входа вам нужно потребовать автозагрузку, как это было раньше. Как я уже сказал, XHP как библиотека предоставляет все необходимые определения тегов, поэтому на данный момент вы получаете class undefined: xhp_tt.   -  person concat    schedule 21.08.2020
comment
Я только что попробовал это: ‹?hh require_once(DIR.'/vendor/autoload.php'); ‹‹__EntryPoint›› function main(): void { $user_name = 'Fred'; echo ‹tt›Привет ‹strong›{$user_name}‹/strong›‹/tt›; } и теперь я получаю \nФатальная ошибка: Uncaught Error: Файл .php должен начинаться с '‹?hh'. in :\nТрассировка стека:\n#0 {main}   -  person reactor    schedule 21.08.2020
comment
Является ли ваша единственная зависимость XHP? Что говорит проверка типов? (hh_client)   -  person concat    schedule 21.08.2020
comment
Да, это так. hh_client выдает кучу ошибок, как описано здесь: stackoverflow.com/questions/62978039/. Возврат к версии старше 4.62, как упоминалось в ветке, — это единственный способ избавиться от ошибок, в то время как рекомендуемые изменения в .hhconfig не помогли. Я также пытался запустить код в версии 4.61 на тот случай, если в версии новее 4.61 были внесены критические изменения в XHP. Я надеюсь, что hack и hhvm все еще серьезно поддерживаются с учетом xhp, и что я наткнулся на то, что они не отказываются от его поддержки.   -  person reactor    schedule 21.08.2020
comment
Возможно, вам потребуется использовать версию 4.0.0rc1. Его файл .hhconfig был обновлен списком кодов исправлений в июне 2020 г.   -  person concat    schedule 21.08.2020
comment
да! это было все. Я потерял два дня из-за этого, поэтому я очень признателен за то, что вы заполнили пробел, чтобы решить эту проблему.   -  person reactor    schedule 21.08.2020
comment
Без проблем! Я резюмирую это в ответе.   -  person concat    schedule 22.08.2020


Ответы (1)


Есть несколько препятствий, с которыми столкнулся OP, чтобы запустить XHP с HHVM 4.62, как обсуждалось в комментариях.

  1. xhp-js и xhp-js-example оба устарели на несколько лет, поэтому они не могут скомпилироваться из-за критических изменений в самом HHVM, как видел OP.
  2. Хотя синтаксис XHP встроен в Hack, все стандартные реализации предоставляются xhp-lib, поэтому необходимо автозагрузить это, чтобы использовать стандартную библиотеку тегов и классов тегов.
  3. Новым в HHVM 4.62 является обязательный белый список FIXME. , который требует от авторов пакетов явного указания разрешенных кодов HH_FIXME в файле .hhconfig. Они были добавлены в XHP-lib в версии 4.0.0rc1, поэтому эта версия необходимо при работе на HHVM 4.62.

Поэтому минимальный проект с XHP на 4.62 выглядит так:

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>;
}
person concat    schedule 22.08.2020
comment
Привет еще раз. Я пытался сделать то же самое на hhvm v 4.83.1, но при переходе на localhost:8080/example.hack снова появляется ошибка \nFatal error: Uncaught Error: Found top-level code in :\nStack trace:\n#0 {main}. Все как указано выше, за исключением разных номеров версий для зависимостей композитора. - person reactor; 16.11.2020