
# Sąveika

Phasis veikia tame pačiame PHP procese kaip jūsų programa, todėl reikšmės perduodamos tarp PHP ir JavaScript be JSON, vamzdžių ar antro vykdymo aplinkos egzemplioriaus. Jos perduodamos **konvertuojant**: skaliarinės reikšmės atitinka JS primityviąsias reikšmes, PHP masyvai nukopijuojami į naujus JS masyvus bei objektus, o JS rezultatai nukopijuojami atgal į PHP masyvus. JS atliktas pakeitimas konvertuotame masyve PHP masyve neatsispindi. Išimtis — PHP iškviečiamieji objektai, kurie išlieka aktyvūs: jie tampa JS funkcijomis, tiesiogiai iškviečiančiomis PHP.

Šiame skyriuje aptariamos taisyklės.

## Puslapiai

- **[Reikšmės](https://phasis.inline0.dev/lt/docs/interop/values)** — abiejų krypčių konvertavimo lentelės: skaičiai, eilutės, loginės reikšmės, null/undefined, masyvai, objektai ir nekonvertuojamos reikšmės.
- **[Pagrindinės programos funkcijos](https://phasis.inline0.dev/lt/docs/interop/host-functions)** — susiekite PHP `callable` kaip JS funkciją per `$engine->setGlobal()`. Argumentų konvertavimas, grąžinamos reikšmės ir išimčių veikimas.
- **[Bendrinami objektai](https://phasis.inline0.dev/lt/docs/interop/shared-objects)** — kas nutinka, kai šiandien perduodate PHP objektą į JS (jis gaunamas kaip `undefined`) ir kaip vietoj jo pateikti PHP būseną bei veikimą naudojant masyvus ir uždarąsias funkcijas.
- **[Fetch transportas](https://phasis.inline0.dev/lt/docs/interop/fetch-transport)** — pakeiskite numatytąją `ext-curl` HTTP posistemę į Guzzle, Symfony HttpClient, imitacinį transportą arba viską draudžiančią konfigūraciją. Taip pat aptariamas politikos kablys leidžiamų adresų sąrašams, antraščių įterpimui ir kiekvienam nuomininkui skirtam susiejimui.
- **[Slapukų saugykla](https://phasis.inline0.dev/lt/docs/interop/cookie-jar)** — prijunkite `get(url)`/`set(url, header)` saugyklą, kad slapukai būtų išsaugomi tarp fetch užklausų. Ji gali būti atmintyje, Symfony BrowserKit arba JS pusėje veikiantis `Map`.
- **[AbortController šablonai](https://phasis.inline0.dev/lt/docs/interop/abort-patterns)** — skirtasis laikas, lenktynės, perdavimas, `AbortSignal.any` / `.timeout` ir tai, kaip tinkintas PHP transportas perdavimo metu tikrina signalą.

## Trumpas pavyzdys

```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
```

## Taip pat žr.

- [API nuoroda](https://phasis.inline0.dev/lt/docs/api) — visa `Phasis\Engine` API sąsaja.
- [Žiniatinklio API](https://phasis.inline0.dev/lt/docs/compatibility/web-apis) — „Web Platform Pack“ ir „Fetch Pack“ veikia tame pačiame sąveikumo sluoksnyje.
