
# Interoperabilität

Phasis läuft im selben PHP-Prozess wie deine Anwendung. Daher wechseln Werte zwischen PHP und JavaScript ohne JSON, Pipes oder eine zweite Laufzeitumgebung. Der Austausch erfolgt durch **Konvertierung**: Skalare werden JS-Primitiven zugeordnet, PHP-Arrays werden in neue JS-Arrays und -Objekte kopiert und JS-Ergebnisse zurück in PHP-Arrays. Änderungen, die JS an einem konvertierten Array vornimmt, sind im PHP-Array nicht sichtbar. PHP-Aufrufbare bleiben als einzige live: Sie werden zu JS-Funktionen, die direkt PHP aufrufen.

Dieser Abschnitt behandelt die Regeln.

## Seiten

- **[Werte](https://phasis.inline0.dev/de/docs/interop/values)** – Konvertierungstabellen in beide Richtungen: Zahlen, Zeichenfolgen, Booleans, null/undefined, Arrays, Objekte und nicht konvertierbare Werte.
- **[Host-Funktionen](https://phasis.inline0.dev/de/docs/interop/host-functions)** – Binde PHP-`callable` als JS-Funktion über `$engine->setGlobal()` ein. Argumentkonvertierung, Rückgabewerte und das Verhalten von Ausnahmen.
- **[Gemeinsam genutzte Objekte](https://phasis.inline0.dev/de/docs/interop/shared-objects)** – Was beim Übergeben eines PHP-Objekts an JS derzeit geschieht (es kommt als `undefined` an) und wie du stattdessen PHP-Zustand und -Verhalten mit Arrays und Closures bereitstellst.
- **[Fetch-Transport](https://phasis.inline0.dev/de/docs/interop/fetch-transport)** – Ersetze das standardmäßige `ext-curl`-HTTP-Backend durch Guzzle, Symfony HttpClient, einen Mock oder eine Variante, die alles ablehnt. Dazu kommt der Policy-Hook für Allowlists, das Einfügen von Headern und die Zuordnung pro Mandant.
- **[Cookie-Jar](https://phasis.inline0.dev/de/docs/interop/cookie-jar)** – Binde ein `get(url)`/`set(url, header)`-Jar ein, um Cookies über Fetch-Aufrufe hinweg zu speichern. In-Memory, Symfony BrowserKit oder ein JS-seitiges `Map`.
- **[AbortController-Muster](https://phasis.inline0.dev/de/docs/interop/abort-patterns)** – Timeout, Race, Weitergabe, `AbortSignal.any` / `.timeout` und wie ein benutzerdefinierter PHP-Transport das Signal während der Übertragung abfragt.

## Schnellstart-Beispiel

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

## Siehe auch

- [Referenz zu API](https://phasis.inline0.dev/de/docs/api) – die vollständige `Phasis\Engine`-Oberfläche.
- [Web-APIs](https://phasis.inline0.dev/de/docs/compatibility/web-apis) – Web Platform Pack und Fetch Pack basieren auf derselben Interoperabilitätsschicht.
