Перейти к содержимому

Взаимодействие

Phasis работает в том же процессе PHP, что и ваше приложение, поэтому значения передаются между PHP и JavaScript без JSON, каналов или второй среды выполнения. Они передаются посредством преобразования: скаляры становятся примитивами JS, массивы PHP копируются в новые массивы и объекты JS, а результаты JS копируются обратно в массивы PHP. Изменения, внесённые JS в преобразованный массив, не видны в массиве PHP. Исключение — вызываемые объекты PHP: они остаются активными и становятся функциями JS, напрямую вызывающими PHP.

В этом разделе описаны правила.

Страницы

  • Значения — таблицы преобразования в обоих направлениях: числа, строки, логические значения, null/undefined, массивы, объекты и значения, которые не преобразуются.
  • Хост-функции — привязка PHP callable как функции JS через $engine->setGlobal(). Преобразование аргументов и возвращаемых значений, а также поведение исключений.
  • Общие объекты — что происходит, если передать объект PHP в JS сейчас (он приходит как undefined), и как предоставлять состояние и поведение PHP с помощью массивов и замыканий.
  • Транспорт Fetch — замените стандартную серверную часть ext-curl HTTP на Guzzle, Symfony HttpClient, имитацию или вариант с запретом всего. Также описан хук политики для разрешённых списков, добавления заголовков и привязки к отдельному арендатору.
  • Хранилище cookie — подключите хранилище get(url)/set(url, header) для сохранения cookie между запросами fetch. В памяти, Symfony BrowserKit или Map на стороне JS.
  • Шаблоны AbortController — тайм-аут, гонка, распространение отмены, AbortSignal.any / .timeout и проверка сигнала пользовательским транспортом PHP во время передачи.

Быстрый пример

PHP
$engine = new Phasis\Engine();

// 1. Bind a PHP callable as a JS function
$engine->setGlobal('greet', fn (string $name) => "Hello, $name!");
echo $engine->eval('greet("world")');  // → Hello, world!

// 2. Let JS change PHP state through a closure
$total = 0;
$engine->setGlobal('add', function (int $n) use (&$total): void { $total += $n; });
$engine->eval('add(2); add(3)');
echo $total;  // → 5

// 3. Call a JS function from PHP
$engine->eval('function add(a, b) { return a + b; }');
echo $engine->call('add', 2, 3);  // → 5

См. также

  • API справочник — полный перечень Phasis\Engine.
  • Веб-API — Web Platform Pack и Fetch Pack работают поверх одного и того же уровня взаимодействия.