
# Взаємодія систем

Phasis працює в тому самому процесі PHP, що й ваша програма, тому значення переходять між PHP і JavaScript без JSON, каналів чи другого середовища виконання. Вони переходять шляхом **перетворення**: скалярні значення стають примітивами JS, масиви PHP копіюються в нові масиви й об’єкти JS, а результати JS копіюються назад у масиви PHP. Зміни, які JS вносить у перетворений масив, не видимі в масиві PHP. Виняток — функції PHP: вони залишаються активними й стають функціями JS, що безпосередньо викликають PHP.

У цьому розділі описано правила.

## Сторінки

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