
# Koostalitlus

Phasis töötab teie rakendusega samas protsessis PHP, seega liiguvad väärtused PHP ja JavaScript vahel ilma JSON, torude või teise käituskeskkonnata. Need liiguvad **teisendamise** teel: skalaarid teisendatakse JS primitiivväärtusteks, massiivid PHP kopeeritakse uuteks JS massiivideks ja objektideks ning tulemused JS kopeeritakse tagasi massiividesse PHP. Muudatused, mida JS teeb teisendatud massiivis, pole massiivis PHP nähtavad. Erandiks on PHP funktsioonid, mis jäävad elavaks: neist saavad funktsioonid JS, mis kutsuvad otse PHP-i.

See jaotis kirjeldab reegleid.

## Lehed

- **[Väärtused](https://phasis.inline0.dev/et/docs/interop/values)** — teisendustabelid mõlemas suunas: arvud, stringid, tõeväärtused, null/undefined, massiivid, objektid ja väärtused, mida ei saa teisendada.
- **[Host-funktsioonid](https://phasis.inline0.dev/et/docs/interop/host-functions)** — siduge PHP `callable` JS funktsioonina `$engine->setGlobal()` kaudu. Argumentide teisendamine, tagastusväärtused ja erandite käitumine.
- **[Jagatud objektid](https://phasis.inline0.dev/et/docs/interop/shared-objects)** — mis juhtub, kui annate PHP objekti JS-le (see jõuab kohale kujul `undefined`), ning kuidas jagada PHP olekut ja käitumist hoopis massiivide ja sulunditega.
- **[Fetchi transport](https://phasis.inline0.dev/et/docs/interop/fetch-transport)** — vahetage vaikimisi `ext-curl` HTTP taustaprogramm Guzzle, Symfony HttpClient, mocki või kõike keelava variandi vastu. Lisaks poliitikakonks lubatud loendi, päiste lisamise ja rentnikupõhise sidumise jaoks.
- **[Küpsiste purk](https://phasis.inline0.dev/et/docs/interop/cookie-jar)** — paigaldage `get(url)`/`set(url, header)` purk küpsiste säilitamiseks fetch-päringute vahel. Mälusisene, Symfony BrowserKit või JS-poolne `Map`.
- **[AbortControlleri mustrid](https://phasis.inline0.dev/et/docs/interop/abort-patterns)** — ajalõpp, võidujooks, levitamine, `AbortSignal.any` / `.timeout` ning kuidas kohandatud PHP transport signaali ülekande ajal kontrollib.

## Kiire näide

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

## Vt ka

- [API viide](https://phasis.inline0.dev/et/docs/api) — kogu `Phasis\Engine` liides.
- [Veebi API-d](https://phasis.inline0.dev/et/docs/compatibility/web-apis) — Web Platform Pack ja Fetch Pack kasutavad sama koostalitluskihti.
