
# Sodelovanje

Phasis deluje v istem procesu PHP kot vaša aplikacija, zato vrednosti prehajajo med PHP in JavaScript brez JSON, cevi ali drugega izvajalnega okolja. Prehajajo s **pretvorbo**: skalarji se preslikajo v primitive JS, tabele PHP se kopirajo v nove tabele in objekte JS, rezultati JS pa nazaj v tabele PHP. Sprememba, ki jo JS naredi v pretvorjeni tabeli, ni vidna v tabeli PHP. Izjema so klicne funkcije PHP, ki ostanejo aktivne: postanejo funkcije JS, ki neposredno kličejo v PHP.

Ta razdelek obravnava pravila.

## Strani

- **[Vrednosti](https://phasis.inline0.dev/sl/docs/interop/values)** — preglednice pretvorb v obe smeri: števila, nizi, logične vrednosti, null/undefined, tabele, objekti in vrednosti, ki se ne pretvorijo.
- **[Gostiteljske funkcije](https://phasis.inline0.dev/sl/docs/interop/host-functions)** — povežite PHP `callable` kot funkcijo JS prek `$engine->setGlobal()`. Pretvorba argumentov, vrnjene vrednosti in ravnanje z izjemami.
- **[Deljeni objekti](https://phasis.inline0.dev/sl/docs/interop/shared-objects)** — kaj se zgodi, ko danes posredujete objekt PHP v JS (prispe kot `undefined`), in kako namesto tega izpostaviti stanje in vedenje PHP s tabelami in zaprtimi funkcijami.
- **[Prenos Fetch](https://phasis.inline0.dev/sl/docs/interop/fetch-transport)** — zamenjajte privzeto zaledno storitev `ext-curl` HTTP z možnostjo Guzzle, Symfony HttpClient, lažnim prenosom ali zavračanjem vsega. Vključuje tudi kavelj pravilnika za sezname dovoljenih, dodajanje glav in vezavo za posameznega najemnika.
- **[Shramba piškotkov](https://phasis.inline0.dev/sl/docs/interop/cookie-jar)** — dodajte shrambo `get(url)`/`set(url, header)` za ohranjanje piškotkov med klici fetch. V pomnilniku, Symfony BrowserKit ali kot shramba `Map` na strani JS.
- **[Vzorci za AbortController](https://phasis.inline0.dev/sl/docs/interop/abort-patterns)** — časovna omejitev, dirka, širjenje, `AbortSignal.any`/`.timeout` in preverjanje signala med prenosom v prenosu PHP po meri.

## Kratek primer

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

## Glejte tudi

- [API referenca](https://phasis.inline0.dev/sl/docs/api) — celoten nabor `Phasis\Engine`.
- [Spletni API-ji](https://phasis.inline0.dev/sl/docs/compatibility/web-apis) — Web Platform Pack in Fetch Pack delujeta na isti plasti sodelovanja.
