相互運用
Phasisはアプリケーションと同じPHPプロセスで実行されるため、PHPとJavaScriptの間で値をJSON、パイプ、別のランタイムを使わずに受け渡せます。値は変換によって受け渡されます。スカラー値はJSプリミティブに対応し、PHP配列は新しいJS配列とオブジェクトにコピーされ、JSの結果はPHP配列にコピーされます。変換後の配列にJSが加えた変更は、PHP配列には反映されません。例外として、PHPの呼び出し可能オブジェクトは有効なまま残り、PHPを直接呼び出すJS関数になります。
このセクションではルールを説明します。
ページ
- 値 — 双方向の変換表です。数値、文字列、ブール値、null/undefined、配列、オブジェクト、変換できない値を扱います。
- ホスト関数 — PHPの
callableを$engine->setGlobal()経由でJS関数としてバインドします。引数の変換、戻り値、例外の挙動について説明します。 - 共有オブジェクト — PHPオブジェクトをJSに渡すと現在どうなるか(
undefinedとして届きます)、配列とクロージャを使ってPHPの状態や振る舞いを公開する方法を説明します。 - Fetchトランスポート — デフォルトの
ext-curlHTTPバックエンドを、Guzzle、Symfony HttpClient、モック、またはすべて拒否する実装に切り替えます。許可リスト、ヘッダー挿入、テナントごとのバインドに使うポリシーフックも扱います。 - Cookie jar —
get(url)/set(url, header)のjarをマウントして、fetch間でCookieを保持します。インメモリ、Symfony BrowserKit、JS側のMapを利用できます。 - AbortControllerのパターン — タイムアウト、競合、伝播、
AbortSignal.any/.timeout、およびカスタムPHPトランスポートが転送中にシグナルをポーリングする方法を説明します。
使用例
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