
# Interoperabilidade

Phasis é executado no mesmo processo PHP que sua aplicação, então os valores passam entre PHP e JavaScript sem JSON, pipes ou um segundo runtime. Eles passam por **conversão**: escalares são mapeados para valores primitivos JS, arrays PHP são copiados para novos arrays e objetos JS, e os resultados JS são copiados de volta para arrays PHP. Uma alteração feita por JS em um array convertido não fica visível no array PHP. Callables PHP são a exceção que permanece ativa: tornam-se funções JS que chamam diretamente PHP.

Esta seção apresenta as regras.

## Páginas

- **[Valores](https://phasis.inline0.dev/pt/docs/interop/values)** — tabelas de conversão nos dois sentidos: números, strings, booleanos, null/undefined, arrays, objetos e valores que não são convertidos.
- **[Funções hospedeiras](https://phasis.inline0.dev/pt/docs/interop/host-functions)** — vincular PHP `callable` como função JS por meio de `$engine->setGlobal()`. Conversão de argumentos, valores de retorno e comportamento das exceções.
- **[Objetos compartilhados](https://phasis.inline0.dev/pt/docs/interop/shared-objects)** — o que acontece quando você passa um objeto PHP para JS atualmente (ele chega como `undefined`) e como expor estado e comportamento PHP usando arrays e closures.
- **[Transporte Fetch](https://phasis.inline0.dev/pt/docs/interop/fetch-transport)** — substituir o backend `ext-curl` HTTP padrão por Guzzle, Symfony HttpClient, um mock ou uma opção que nega tudo. Inclui também o gancho de política para listas de permissões, injeção de cabeçalhos e vinculação por locatário.
- **[Armazenamento de cookies](https://phasis.inline0.dev/pt/docs/interop/cookie-jar)** — montar um armazenamento `get(url)`/`set(url, header)` para persistir cookies entre chamadas fetch. Em memória, Symfony BrowserKit ou um JS do lado do `Map`.
- **[Padrões de AbortController](https://phasis.inline0.dev/pt/docs/interop/abort-patterns)** — timeout, corrida, propagação, `AbortSignal.any` / `.timeout` e como um transporte PHP personalizado verifica o sinal durante a transferência.

## Exemplo rápido

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

## Veja também

- [API referência](https://phasis.inline0.dev/pt/docs/api) — toda a superfície `Phasis\Engine`.
- [APIs da Web](https://phasis.inline0.dev/pt/docs/compatibility/web-apis) — Web Platform Pack e Fetch Pack usam a mesma camada de interoperabilidade.
