Pular para o conteúdo

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 — 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 — 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 — 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 — 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 — 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 — 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 — toda a superfície Phasis\Engine.
  • APIs da Web — Web Platform Pack e Fetch Pack usam a mesma camada de interoperabilidade.