
# Yhteentoimivuus

Phasis suoritetaan samassa PHP-prosessissa kuin sovelluksesi, joten arvot siirtyvät PHP:n ja JavaScript:n välillä ilman JSON-toimintoa, putkia tai toista ajonaikaista ympäristöä. Siirto tapahtuu **muuntamalla**: skalaariarvot muunnetaan JS-primitiiveiksi, PHP-taulukot kopioidaan uusiksi JS-taulukoiksi ja -olioiksi, ja JS-tulokset kopioidaan takaisin PHP-taulukoiksi. Muutos, jonka JS tekee muunnettuun taulukkoon, ei näy alkuperäisessä PHP-taulukossa. PHP-kutsuttavat ovat poikkeus, joka pysyy aktiivisena: niistä tulee JS-funktioita, jotka kutsuvat suoraan kohteeseen PHP.

Tässä osiossa käsitellään säännöt.

## Sivut

- **[Arvot](https://phasis.inline0.dev/fi/docs/interop/values)** — muunnostaulukot molempiin suuntiin: numerot, merkkijonot, totuusarvot, null/undefined, taulukot, oliot ja arvot, joita ei muunneta.
- **[Isäntäfunktiot](https://phasis.inline0.dev/fi/docs/interop/host-functions)** — sido PHP `callable` `$engine->setGlobal()`-määrityksellä JS-funktioksi. Argumenttien muunnos, paluuarvot ja poikkeusten toiminta.
- **[Jaetut oliot](https://phasis.inline0.dev/fi/docs/interop/shared-objects)** — mitä tapahtuu, kun välität PHP-olion JS:lle nykytilanteessa (se saapuu muodossa `undefined`), sekä miten tarjoat PHP-tilan ja toiminnan taulukoilla ja sulkeumilla.
- **[Fetch-kuljetus](https://phasis.inline0.dev/fi/docs/interop/fetch-transport)** — vaihda oletusarvoinen `ext-curl` HTTP-taustajärjestelmä kohteeseen Guzzle, Symfony HttpClient, mockiin tai kaikki estävään toteutukseen. Lisäksi käytäntökoukku sallittujen listaamiseen, otsakkeiden lisäämiseen ja vuokralaiskohtaiseen sidontaan.
- **[Evästepurkki](https://phasis.inline0.dev/fi/docs/interop/cookie-jar)** — liitä `get(url)`/`set(url, header)`-purkki evästeiden säilyttämiseksi hakujen välillä. Muistissa oleva, Symfony BrowserKit tai JS-puolen `Map`.
- **[AbortController-mallit](https://phasis.inline0.dev/fi/docs/interop/abort-patterns)** — aikakatkaisu, kilpailutus, välitys, `AbortSignal.any` / `.timeout` ja se, miten mukautettu PHP-kuljetus kyselee signaalin tilaa siirron aikana.

## Pikaesimerkki

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

## Katso myös

- [API-viite](https://phasis.inline0.dev/fi/docs/api) — koko `Phasis\Engine`-rajapinta.
- [Verkkorajapinnat](https://phasis.inline0.dev/fi/docs/compatibility/web-apis) — Web Platform Pack ja Fetch Pack toimivat saman yhteentoimivuuskerroksen päällä.
