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

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

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

## Страницы

- **[Значения](https://phasis.inline0.dev/ru/docs/interop/values)** — таблицы преобразования в обоих направлениях: числа, строки, логические значения, null/undefined, массивы, объекты и значения, которые не преобразуются.
- **[Хост-функции](https://phasis.inline0.dev/ru/docs/interop/host-functions)** — привязка PHP `callable` как функции JS через `$engine->setGlobal()`. Преобразование аргументов и возвращаемых значений, а также поведение исключений.
- **[Общие объекты](https://phasis.inline0.dev/ru/docs/interop/shared-objects)** — что происходит, если передать объект PHP в JS сейчас (он приходит как `undefined`), и как предоставлять состояние и поведение PHP с помощью массивов и замыканий.
- **[Транспорт Fetch](https://phasis.inline0.dev/ru/docs/interop/fetch-transport)** — замените стандартную серверную часть `ext-curl` HTTP на Guzzle, Symfony HttpClient, имитацию или вариант с запретом всего. Также описан хук политики для разрешённых списков, добавления заголовков и привязки к отдельному арендатору.
- **[Хранилище cookie](https://phasis.inline0.dev/ru/docs/interop/cookie-jar)** — подключите хранилище `get(url)`/`set(url, header)` для сохранения cookie между запросами fetch. В памяти, Symfony BrowserKit или `Map` на стороне JS.
- **[Шаблоны AbortController](https://phasis.inline0.dev/ru/docs/interop/abort-patterns)** — тайм-аут, гонка, распространение отмены, `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 справочник](https://phasis.inline0.dev/ru/docs/api) — полный перечень `Phasis\Engine`.
- [Веб-API](https://phasis.inline0.dev/ru/docs/compatibility/web-apis) — Web Platform Pack и Fetch Pack работают поверх одного и того же уровня взаимодействия.
