
# Interoperabilitas

Phasis berjalan dalam proses PHP yang sama dengan aplikasi Anda, sehingga nilai berpindah antara PHP dan JavaScript tanpa JSON, pipe, atau runtime kedua. Perpindahan dilakukan melalui **konversi**: skalar dipetakan ke primitif JS, array PHP disalin menjadi array dan objek JS baru, lalu hasil JS disalin kembali ke array PHP. Perubahan yang dibuat JS pada array hasil konversi tidak terlihat pada array PHP. Callable PHP adalah pengecualian yang tetap aktif: callable tersebut menjadi fungsi JS yang langsung memanggil PHP.

Bagian ini membahas aturan-aturannya.

## Halaman

- **[Nilai](https://phasis.inline0.dev/id/docs/interop/values)** — tabel konversi untuk kedua arah: angka, string, boolean, null/undefined, array, objek, dan nilai yang tidak dapat dikonversi.
- **[Fungsi host](https://phasis.inline0.dev/id/docs/interop/host-functions)** — ikat PHP `callable` sebagai fungsi JS melalui `$engine->setGlobal()`. Konversi argumen, nilai kembalian, dan cara exception ditangani.
- **[Objek bersama](https://phasis.inline0.dev/id/docs/interop/shared-objects)** — apa yang terjadi saat Anda memberikan objek PHP ke JS saat ini (objek tersebut diterima sebagai `undefined`), serta cara mengekspos status dan perilaku PHP menggunakan array dan closure.
- **[Transport Fetch](https://phasis.inline0.dev/id/docs/interop/fetch-transport)** — ganti backend `ext-curl` HTTP bawaan dengan Guzzle, Symfony HttpClient, mock, atau konfigurasi tolak semua. Termasuk hook kebijakan untuk allowlist, injeksi header, dan pengikatan per tenant.
- **[Cookie jar](https://phasis.inline0.dev/id/docs/interop/cookie-jar)** — pasang jar `get(url)`/`set(url, header)` untuk menyimpan cookie di antara fetch. Dalam memori, Symfony BrowserKit, atau JS di sisi `Map`.
- **[Pola AbortController](https://phasis.inline0.dev/id/docs/interop/abort-patterns)** — timeout, race, propagasi, `AbortSignal.any` / `.timeout`, dan cara transport PHP khusus memeriksa sinyal di tengah transfer.

## Contoh singkat

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

## Lihat juga

- [API referensi](https://phasis.inline0.dev/id/docs/api) — seluruh permukaan `Phasis\Engine`.
- [API Web](https://phasis.inline0.dev/id/docs/compatibility/web-apis) — Web Platform Pack dan Fetch Pack menggunakan lapisan interoperabilitas yang sama.
