
# Propojení

Phasis běží ve stejném procesu PHP jako vaše aplikace, takže hodnoty přecházejí mezi PHP a JavaScript bez JSON, rour nebo druhého běhového prostředí. Přecházejí prostřednictvím **převodu**: skaláry se mapují na primitivní hodnoty JS, pole PHP se kopírují do nových polí a objektů JS a výsledky JS se kopírují zpět do polí PHP. Změna, kterou JS provede v převedeném poli, se v poli PHP neprojeví. Výjimkou jsou volatelné objekty PHP, které zůstávají živé: stanou se funkcemi JS, jež volají přímo do PHP.

Tato část popisuje pravidla.

## Stránky

- **[Hodnoty](https://phasis.inline0.dev/cs/docs/interop/values)** — tabulky převodu oběma směry: čísla, řetězce, logické hodnoty, null/undefined, pole, objekty a hodnoty, které převést nelze.
- **[Hostitelské funkce](https://phasis.inline0.dev/cs/docs/interop/host-functions)** — navázání PHP `callable` jako funkce JS pomocí `$engine->setGlobal()`. Převod argumentů, návratové hodnoty a chování výjimek.
- **[Sdílené objekty](https://phasis.inline0.dev/cs/docs/interop/shared-objects)** — co se dnes stane, když předáte objekt PHP do JS (převede se na `undefined`) a jak zpřístupnit stav a chování PHP pomocí polí a uzávěrů.
- **[Fetch transport](https://phasis.inline0.dev/cs/docs/interop/fetch-transport)** — nahrazení výchozího backendu `ext-curl` HTTP za Guzzle, Symfony HttpClient, mock nebo úplné zamítnutí. Také háček pro pravidla povolených položek, vkládání hlaviček a vazby pro jednotlivé tenanty.
- **[Úložiště cookies](https://phasis.inline0.dev/cs/docs/interop/cookie-jar)** — připojení úložiště `get(url)`/`set(url, header)` pro uchovávání cookies mezi požadavky fetch. V paměti, Symfony BrowserKit nebo JS `Map`.
- **[Vzory AbortController](https://phasis.inline0.dev/cs/docs/interop/abort-patterns)** — časový limit, závod, předávání signálu, `AbortSignal.any` / `.timeout` a způsob, jakým vlastní transport PHP kontroluje signál během přenosu.

## Rychlý příklad

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

## Viz také

- [Reference API](https://phasis.inline0.dev/cs/docs/api) — kompletní rozhraní `Phasis\Engine`.
- [Webová rozhraní](https://phasis.inline0.dev/cs/docs/compatibility/web-apis) — Web Platform Pack a Fetch Pack využívají stejnou vrstvu propojení.
