
# Samverkan mellan språk

Phasis körs i samma process av typen PHP som din applikation, så värden passerar mellan PHP och JavaScript utan JSON, pipes eller en andra runtime. De passerar genom **konvertering**: skalärer blir grundvärden av typen JS, arrayer och objekt av typen PHP kopieras till nya arrayer och objekt av typen JS och resultat av typen JS kopieras tillbaka till arrayer av typen PHP. En ändring som JS gör i en konverterad array syns inte i arrayen av typen PHP. Funktioner av typen PHP är undantaget som förblir aktiva: de blir funktioner av typen JS som anropar direkt i PHP.

Det här avsnittet beskriver reglerna.

## Sidor

- **[Värden](https://phasis.inline0.dev/sv/docs/interop/values)** — konverteringstabeller i båda riktningarna: tal, strängar, booleska värden, null/undefined, arrayer, objekt och värden som inte kan konverteras.
- **[Värdfunktioner](https://phasis.inline0.dev/sv/docs/interop/host-functions)** — koppla PHP `callable` till en funktion av typen JS via `$engine->setGlobal()`. Konvertering av argument och returvärden samt hur undantag hanteras.
- **[Delade objekt](https://phasis.inline0.dev/sv/docs/interop/shared-objects)** — vad som händer när du skickar ett objekt av typen PHP till JS i dag (det blir `undefined`) och hur du i stället exponerar tillstånd och beteende av typen PHP med arrayer och slutningar.
- **[Fetch-transport](https://phasis.inline0.dev/sv/docs/interop/fetch-transport)** — byt ut standardbackend för `ext-curl` HTTP mot Guzzle, Symfony HttpClient, en mock eller en transport som nekar allt. Även en hook för principer som hanterar tillåtelselistor, tillägg av headers och koppling per klient.
- **[Cookie-lagring](https://phasis.inline0.dev/sv/docs/interop/cookie-jar)** — koppla in en lagring av typen `get(url)`/`set(url, header)` för att spara cookies mellan hämtningar. I minnet, Symfony BrowserKit eller en lagring på sidan JS av typen `Map`.
- **[Mönster för AbortController](https://phasis.inline0.dev/sv/docs/interop/abort-patterns)** — tidsgräns, kapplöpning, propagering, `AbortSignal.any` / `.timeout` och hur en anpassad transport av typen PHP kontrollerar signalen under överföringen.

## Snabbexempel

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

- [API-referens](https://phasis.inline0.dev/sv/docs/api) — hela gränssnittet för `Phasis\Engine`.
- [Web APIs](https://phasis.inline0.dev/sv/docs/compatibility/web-apis) — Web Platform Pack och Fetch Pack använder samma samverkanslager.
