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

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

Този раздел разглежда правилата.

## Страници

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