
# Współdziałanie

Phasis działa w tym samym procesie PHP co aplikacja, więc wartości przechodzą między PHP i JavaScript bez JSON, potoków ani drugiego środowiska uruchomieniowego. Są przekazywane przez **konwersję**: typy skalarne mapują się na typy proste JS, tablice PHP są kopiowane do nowych tablic i obiektów JS, a wyniki JS są kopiowane z powrotem do tablic PHP. Zmiana wprowadzona przez JS w przekonwertowanej tablicy nie jest widoczna w tablicy PHP. Wyjątkiem są funkcje wywoływalne PHP, które pozostają aktywne: stają się funkcjami JS wywołującymi bezpośrednio PHP.

Ta sekcja opisuje te zasady.

## Strony

- **[Wartości](https://phasis.inline0.dev/pl/docs/interop/values)** — tabele konwersji w obu kierunkach: liczby, ciągi, wartości logiczne, null/undefined, tablice, obiekty i wartości, których nie można przekonwertować.
- **[Funkcje hosta](https://phasis.inline0.dev/pl/docs/interop/host-functions)** — wiązanie PHP `callable` jako funkcji JS przez `$engine->setGlobal()`. Konwersja argumentów, wartości zwracane i obsługa wyjątków.
- **[Obiekty współdzielone](https://phasis.inline0.dev/pl/docs/interop/shared-objects)** — co dzieje się obecnie po przekazaniu obiektu PHP do JS (zostaje on przekazany jako `undefined`) oraz jak udostępniać stan i zachowanie PHP za pomocą tablic i domknięć.
- **[Transport fetch](https://phasis.inline0.dev/pl/docs/interop/fetch-transport)** — zastąp domyślny backend `ext-curl` HTTP przez Guzzle, Symfony HttpClient, atrapę lub blokadę wszystkiego. Do tego funkcja zasad obsługująca listy dozwolone, wstrzykiwanie nagłówków i przypisywanie dla poszczególnych dzierżawców.
- **[Magazyn plików cookie](https://phasis.inline0.dev/pl/docs/interop/cookie-jar)** — podłącz magazyn `get(url)`/`set(url, header)`, aby zachowywać pliki cookie między wywołaniami fetch. W pamięci, Symfony BrowserKit lub JS-stronny `Map`.
- **[Wzorce AbortController](https://phasis.inline0.dev/pl/docs/interop/abort-patterns)** — limit czasu, wyścig, propagacja, `AbortSignal.any` / `.timeout` oraz obsługa sygnału przez własny transport PHP podczas transferu.

## Szybki przykład

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

## Zobacz także

- [API dokumentacja referencyjna](https://phasis.inline0.dev/pl/docs/api) — pełny zakres `Phasis\Engine`.
- [API internetowe](https://phasis.inline0.dev/pl/docs/compatibility/web-apis) — Web Platform Pack i Fetch Pack działają na tej samej warstwie interoperacyjności.
