Взаимодействие
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-curlHTTP на 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 работают поверх одного и того же уровня взаимодействия.