
# Együttműködés

A Phasis az alkalmazással azonos PHP folyamatban fut, így az értékek a PHP és JavaScript között JSON, csővezetékek vagy egy második futtatókörnyezet nélkül jutnak át. **Konverzióval** lépik át a határt: a skalárok JS primitívekké alakulnak, a PHP tömbök új JS tömbökbe és objektumokba másolódnak, az JS eredmények pedig PHP tömbökbe másolódnak vissza. Az JS által a konvertált tömbön végzett módosítás nem látszik az PHP tömbben. A PHP hívható elemek kivételt jelentenek, mert aktív kapcsolatban maradnak: JS függvényekké válnak, amelyek közvetlenül a PHP környezetbe hívnak.

Ez a szakasz ismerteti a szabályokat.

## Oldalak

- **[Értékek](https://phasis.inline0.dev/hu/docs/interop/values)** — a konverziót bemutató táblázatok mindkét irányban: számok, karakterláncok, logikai értékek, null/undefined, tömbök, objektumok és a nem konvertálható értékek.
- **[Gazdafüggvények](https://phasis.inline0.dev/hu/docs/interop/host-functions)** — PHP `callable` kötése JS függvényként a `$engine->setGlobal()` segítségével. Argumentumkonverzió, visszatérési értékek és a kivételek kezelése.
- **[Megosztott objektumok](https://phasis.inline0.dev/hu/docs/interop/shared-objects)** — mi történik ma, ha PHP objektumot ad át a JS számára (`undefined` formájában érkezik meg), és hogyan tehetők elérhetővé az PHP állapota és viselkedése tömbökkel és closure-ökkel.
- **[Fetch-átvitel](https://phasis.inline0.dev/hu/docs/interop/fetch-transport)** — az alapértelmezett `ext-curl` HTTP háttér cseréje Guzzle-re, Symfony HttpClient-ra, mockra vagy mindent letiltó megoldásra. Emellett szabályzati hook engedélyezési listához, fejlécek hozzáadásához és bérlőnkénti kötéshez.
- **[Cookie-tár](https://phasis.inline0.dev/hu/docs/interop/cookie-jar)** — `get(url)`/`set(url, header)` tár csatlakoztatása a cookie-k fetch-hívások közötti megőrzéséhez. Memóriában tárolt, Symfony BrowserKit vagy JS oldali `Map`.
- **[AbortController-minták](https://phasis.inline0.dev/hu/docs/interop/abort-patterns)** — időkorlát, versenyhelyzet, továbbítás, `AbortSignal.any` / `.timeout`, valamint hogy az egyéni PHP átvitel miként kérdezi le a jelet adatátvitel közben.

## Gyors példa

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

## Lásd még

- [API referencia](https://phasis.inline0.dev/hu/docs/api) — a teljes `Phasis\Engine` felület.
- [Webes API-k](https://phasis.inline0.dev/hu/docs/compatibility/web-apis) — a Web Platform Pack és a Fetch Pack ugyanazon az együttműködési rétegen működik.
