
# Interoperabiliteit

Phasis draait in hetzelfde proces van PHP als je applicatie, dus waarden gaan tussen PHP en JavaScript zonder JSON, pipes of een tweede runtime. Ze worden uitgewisseld via **conversie**: scalaire waarden worden omgezet naar primitieven van JS, arrays van PHP worden gekopieerd naar nieuwe arrays en objecten van JS, en resultaten van JS worden teruggekopieerd naar arrays van PHP. Wijzigingen die JS aanbrengt in een geconverteerde array, zijn niet zichtbaar in de array van PHP. Callables van PHP vormen de uitzondering die actief blijft: ze worden functies van JS die rechtstreeks aanroepen doen in PHP.

In dit gedeelte vind je de regels.

## Pagina's

- **[Waarden](https://phasis.inline0.dev/nl/docs/interop/values)** — de conversietabellen in beide richtingen: getallen, tekenreeksen, booleans, null/undefined, arrays, objecten en waarden die niet kunnen worden geconverteerd.
- **[Hostfuncties](https://phasis.inline0.dev/nl/docs/interop/host-functions)** — bind PHP `callable` als functie van JS via `$engine->setGlobal()`. Conversie van argumenten, retourwaarden en de afhandeling van uitzonderingen.
- **[Gedeelde objecten](https://phasis.inline0.dev/nl/docs/interop/shared-objects)** — wat er gebeurt wanneer je vandaag een object van PHP aan JS doorgeeft (het komt aan als `undefined`), en hoe je PHP-status en -gedrag beschikbaar maakt met arrays en closures.
- **[Fetch-transport](https://phasis.inline0.dev/nl/docs/interop/fetch-transport)** — vervang de standaardbackend voor `ext-curl` HTTP door Guzzle, Symfony HttpClient, een mock of een transport dat alles weigert. Ook de beleidsfunctie voor allowlisting, het toevoegen van headers en binding per tenant.
- **[Cookiepot](https://phasis.inline0.dev/nl/docs/interop/cookie-jar)** — koppel een pot van `get(url)`/`set(url, header)` om cookies tussen fetches te bewaren. In het geheugen, Symfony BrowserKit of een JS-`Map`.
- **[Patronen voor AbortController](https://phasis.inline0.dev/nl/docs/interop/abort-patterns)** — time-out, race, propagatie, `AbortSignal.any` / `.timeout` en hoe een aangepast transport van PHP het signaal tijdens de overdracht controleert.

## Snel voorbeeld

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

## Zie ook

- [API-referentie](https://phasis.inline0.dev/nl/docs/api) — de volledige `Phasis\Engine`-interface.
- [Web-API's](https://phasis.inline0.dev/nl/docs/compatibility/web-apis) — Web Platform Pack en Fetch Pack bouwen voort op dezelfde interoplaag.
