본문으로 건너뛰기

상호 운용

Phasis은 애플리케이션과 동일한 PHP 프로세스에서 실행되므로 값이 PHP와 JavaScript 사이를 JSON, 파이프 또는 두 번째 런타임 없이 오갑니다. 값은 변환되어 전달됩니다. 스칼라는 JS 기본형으로 대응되고, PHP 배열은 새 JS 배열과 객체로 복사되며, JS 결과는 PHP 배열로 다시 복사됩니다. JS이 변환된 배열을 변경해도 PHP 배열에는 반영되지 않습니다. PHP 호출 가능 함수는 계속 연결된 상태로 유지되는 예외입니다. 이 함수는 PHP로 바로 호출하는 JS 함수가 됩니다.

이 섹션에서는 규칙을 설명합니다.

페이지

  • 값 — 양방향 변환 표: 숫자, 문자열, 불리언, null/undefined, 배열, 객체 및 변환되지 않는 값.
  • 호스트 함수 — PHP callable을 JS 함수로 $engine->setGlobal()을 통해 연결합니다. 인수 변환, 반환값 및 예외 동작을 다룹니다.
  • 공유 객체 — 현재 JS에 PHP 객체를 전달하면 어떻게 되는지(undefined로 전달됨), 배열과 클로저로 PHP 상태와 동작을 노출하는 방법을 설명합니다.
  • Fetch 전송 계층 — 기본 ext-curl HTTP 백엔드를 Guzzle, Symfony HttpClient, 모의 객체 또는 전면 차단 방식으로 바꿉니다. 허용 목록, 헤더 삽입 및 테넌트별 연결을 위한 정책 훅도 다룹니다.
  • 쿠키 저장소 — get(url)/set(url, header) 저장소를 연결해 fetch 간 쿠키를 유지합니다. 메모리 내 저장소, 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

관련 항목

  • API 참조 — 전체 Phasis\Engine 기능.
  • 웹 API — Web Platform Pack과 Fetch Pack은 동일한 상호 운용 계층 위에서 작동합니다.