
# Interoperabilità

Phasis viene eseguito nello stesso processo PHP dell'applicazione, quindi i valori passano tra PHP e JavaScript senza JSON, pipe o un secondo runtime. Il passaggio avviene tramite **conversione**: gli scalari diventano primitive JS, gli array PHP vengono copiati in nuovi array e oggetti JS, mentre i risultati JS vengono copiati in array PHP. Le modifiche apportate da JS a un array convertito non sono visibili nell'array PHP. Le funzioni richiamabili PHP sono l'eccezione che rimane attiva: diventano funzioni JS che chiamano direttamente PHP.

Questa sezione illustra le regole.

## Pagine

- **[Valori](https://phasis.inline0.dev/it/docs/interop/values)** — le tabelle di conversione in entrambe le direzioni: numeri, stringhe, booleani, null/undefined, array, oggetti e valori che non vengono convertiti.
- **[Funzioni host](https://phasis.inline0.dev/it/docs/interop/host-functions)** — associa PHP `callable` come funzione JS tramite `$engine->setGlobal()`. Conversione degli argomenti, valori restituiti e comportamento delle eccezioni.
- **[Oggetti condivisi](https://phasis.inline0.dev/it/docs/interop/shared-objects)** — cosa succede oggi quando passi un oggetto PHP a JS (viene ricevuto come `undefined`) e come esporre stato e comportamento PHP usando invece array e closure.
- **[Trasporto Fetch](https://phasis.inline0.dev/it/docs/interop/fetch-transport)** — sostituisci il backend predefinito `ext-curl` HTTP con Guzzle, Symfony HttpClient, un mock o un'opzione che nega tutto. Include anche l'hook per le policy di allowlist, l'inserimento di header e l'associazione per tenant.
- **[Archivio cookie](https://phasis.inline0.dev/it/docs/interop/cookie-jar)** — configura un archivio `get(url)`/`set(url, header)` per mantenere i cookie tra le richieste fetch. In memoria, Symfony BrowserKit oppure un JS lato server `Map`.
- **[Schemi con AbortController](https://phasis.inline0.dev/it/docs/interop/abort-patterns)** — timeout, race, propagazione, `AbortSignal.any` / `.timeout` e modalità con cui un trasporto PHP personalizzato controlla il segnale durante il trasferimento.

## Esempio rapido

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

## Vedi anche

- [API riferimento](https://phasis.inline0.dev/it/docs/api) — l'intera superficie `Phasis\Engine`.
- [API Web](https://phasis.inline0.dev/it/docs/compatibility/web-apis) — Web Platform Pack e Fetch Pack si basano sullo stesso livello di interoperabilità.
