
# Samspil

Phasis kører i samme PHP-proces som din applikation, så værdier krydser mellem PHP og JavaScript uden JSON, pipes eller en ekstra runtime. De krydser ved **konvertering**: skalære værdier bliver til primitive JS-værdier, PHP-arrays kopieres til nye JS-arrays og -objekter, og JS-resultater kopieres tilbage til PHP-arrays. En ændring, som JS foretager i et konverteret array, kan ikke ses i PHP-arrayet. PHP-callables er undtagelsen, der forbliver aktive: de bliver til JS-funktioner, der kalder direkte ind i PHP.

Dette afsnit gennemgår reglerne.

## Sider

- **[Værdier](https://phasis.inline0.dev/da/docs/interop/values)** — konverteringstabellerne i begge retninger: tal, strenge, booleske værdier, null/undefined, arrays, objekter og værdier, der ikke kan konverteres.
- **[Værtsfunktioner](https://phasis.inline0.dev/da/docs/interop/host-functions)** — bind PHP `callable` som JS-funktion via `$engine->setGlobal()`. Argumentkonvertering, returværdier og undtagelseshåndtering.
- **[Delte objekter](https://phasis.inline0.dev/da/docs/interop/shared-objects)** — hvad der sker, når du giver et PHP-objekt til JS i dag (det ankommer som `undefined`), og hvordan du eksponerer PHP-tilstand og -adfærd med arrays og closure-funktioner i stedet.
- **[Fetch-transport](https://phasis.inline0.dev/da/docs/interop/fetch-transport)** — udskift standardbackend til `ext-curl` HTTP med Guzzle, Symfony HttpClient, en mock eller en løsning, der afviser alt. Plus en politik-hook til tilladelseslister, indsættelse af headers og binding pr. lejer.
- **[Cookiejar](https://phasis.inline0.dev/da/docs/interop/cookie-jar)** — tilslut en `get(url)`/`set(url, header)`-jar for at bevare cookies mellem fetches. I hukommelsen, Symfony BrowserKit eller en JS-side `Map`.
- **[AbortController-mønstre](https://phasis.inline0.dev/da/docs/interop/abort-patterns)** — timeout, kapløb, videresendelse, `AbortSignal.any` / `.timeout`, og hvordan en brugerdefineret PHP-transport aflæser signalet under overførslen.

## Hurtigt eksempel

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

## Se også

- [API-reference](https://phasis.inline0.dev/da/docs/api) — hele `Phasis\Engine`-overfladen.
- [Web-API'er](https://phasis.inline0.dev/da/docs/compatibility/web-apis) — Web Platform Pack og Fetch Pack bygger oven på det samme samspilslag.
