
# 简介
Phasis 是纯 PHP JavaScript 引擎。它在宿主 PHP 进程中对 ECMAScript 进行词法分析、解析和执行，无需 `exec('node …')`、FFI 或自定义二进制扩展。它需要三个标准 PHP 扩展：`ext-mbstring`、`ext-bcmath` 和 `ext-curl`（默认 `fetch()` 传输机制）。`ext-intl` 和 `ext-openssl` 是可选的。若构建版本未包含 `bcmath`，请参阅[入门指南](https://phasis.inline0.dev/zh/docs/getting-started)。

- **可嵌入** — 通过 `Phasis\Engine` 类，将 JS 运行时嵌入任何 PHP 应用、框架或 CLI 工具。
- **符合规范** — 通过官方 test262 测试套件，覆盖率达 100%，涵盖每个类别且没有跳过。
- **Web API** — 完整的 **Web Platform Pack**（URL、TextEncoder/Decoder、atob/btoa、structuredClone、performance、DOMException）、完整的 **Fetch Pack**（fetch、Request、Response、Headers、Body、AbortController/Signal、Blob、File、FormData、EventTarget、完整 WHATWG Streams、navigator），以及 `crypto` + `SubtleCrypto`、`WebSocket`、`XMLHttpRequest` 和真正的事件循环。导入的 Web Platform Tests 通过率为 100%。
- **现代功能** — 箭头函数、类、async/await、Promises、生成器、Symbol、BigInt、Proxy、Reflect、Temporal、Intl、TypedArrays 和完整模块支持。
- **PHP↔JS 互操作** — 将 PHP 标量和数组传入 JS（数组会被复制），将 PHP 闭包绑定为 JS 函数，并从 PHP 调用 JS 函数。PHP 对象目前还不能与 JS 共享；请参阅[共享对象](https://phasis.inline0.dev/zh/docs/interop/shared-objects)。

## Phasis 的由来

需要运行用户提供的 JavaScript 的 PHP 应用——例如模板引擎、前端 SSR 兼容层、数据验证规则、内容沙箱和无头测试运行器——通常会调用 Node.js，或者放弃这项功能。无论哪种方式都会增加运维复杂度：多一个运行时、一个序列化边界、一系列子进程管道，以及在共享主机环境中难以安全部署的问题。

Phasis 弥补了这一缺口。你的 PHP 代码仅使用 PHP 8.2+、`mbstring`、`bcmath` 和 `curl`，就能对 JavaScript 进行词法分析、解析和执行。引擎以 Composer 包的形式发布，并提供小巧精简的 API 接口。

## 功能说明

- 实现完整的 ECMAScript 标准库：`Array`、`String`、`Object`、`Math`、`JSON`、`Date`、`RegExp`、`Map`、`Set`、`Promise`、`Proxy`、`Reflect`、`Symbol`、`BigInt`、`TypedArray`、`Temporal`、`Intl`、生成器、异步迭代器和模块。
- 提供真实 JS 库会预先检查的 **Web Platform** API：`URL`、`URLSearchParams`、`TextEncoder`/`TextDecoder`、`atob`/`btoa`、`structuredClone`、`performance`、`DOMException`。完整接口请参阅[Web API](https://phasis.inline0.dev/zh/docs/compatibility/web-apis)。
- 提供 **`fetch`** 和完整的 Fetch 系列——`Request`、`Response`、`Headers`、正文读取方法、`AbortController`/`AbortSignal`、`Blob`、`File`、`FormData`、`EventTarget`/`Event`，以及完整的 WHATWG Streams（`ReadableStream`、`WritableStream`、`TransformStream`、BYOB、排队策略）。通过 PHP 的 `ext-curl`，真正的 HTTP 开箱即用。
- 提供 **`crypto`** + 完整的 `SubtleCrypto`（SHA 系列、HMAC、AES-GCM/CBC/CTR、RSA-OAEP/PSS/PKCS1、ECDSA、ECDH、HKDF、PBKDF2）、**`WebSocket`**（RFC 6455 + 可替换传输机制）以及 **`XMLHttpRequest`**（基于同一 Fetch 传输机制构建）。
- 提供真正的 **事件循环**：`setTimeout`、`setInterval`、`clearTimeout`、`clearInterval`、`queueMicrotask`，以及 Stage-3 `AsyncContext`，用于在异步边界之间传递值。
- 支持现代语法——解构、展开/剩余参数、计算属性、可选链、空值合并、模板字面量、标记模板、类（包括私有字段、静态代码块和装饰器）以及顶层 await。
- 支持跨越 PHP↔JS 边界转换值。标量和数组会被复制传入，PHP 可调用对象会转换为 JS 函数，JS 的结果会以 PHP 标量和数组的形式返回。具体规则请参阅[值转换](https://phasis.inline0.dev/zh/docs/interop/values)。
- 由宿主控制运行。宿主管理 `fetch` 传输机制和策略钩子，事件循环使用虚拟时间运行，固定的调用栈上限可阻止无限递归。虽然提供了循环迭代次数限制，但目前尚未对字节码 VM 运行的循环强制执行；此外也没有字符串长度、输出或墙钟时间限制，详见 [API：setLimit](https://phasis.inline0.dev/zh/docs/api#setlimit)。
- 使用 Node.js（V8）验证。每次推送到 `main` 以及每个拉取请求都会触发 CI 运行单元测试和预言机测试套件；引擎源码变更时，还会运行 Web Platform Tests 和热门软件包测试套件。完整的 test262 矩阵需手动运行，并将其快照提交到 `COMPAT.md`。请参阅[兼容性](https://phasis.inline0.dev/zh/docs/compatibility)。

## 它不是什么

Phasis 不是 JIT 编译器，而是树遍历解释器，并配有按需运行的字节码 VM。在受分派开销限制的工作负载中，其运行时间约为 100× V8。这一取舍带来零依赖、纯 PHP 和由宿主控制的执行，非常适合将 JavaScript 嵌入 PHP 应用，在这些应用中，正确性和隔离比原始吞吐量更重要。

## 从这里开始

- [入门指南](https://phasis.inline0.dev/zh/docs/getting-started) — 安装并运行你的第一个脚本。
- [CLI](https://phasis.inline0.dev/zh/docs/cli) — `bin/phasis`，用于运行文件、执行源代码和导出 AST。
- [API](https://phasis.inline0.dev/zh/docs/api) — 将 `Phasis\Engine` 嵌入你的 PHP 应用。
- [互操作](https://phasis.inline0.dev/zh/docs/interop) — 将 PHP 值和可调用对象传递给 JavaScript。
- [兼容性](https://phasis.inline0.dev/zh/docs/compatibility) — test262 覆盖率和支持的功能。
- [解析器](https://phasis.inline0.dev/zh/docs/parser) — 将 JavaScript 解析为带类型的 AST 或 ESTree，而不执行它。
- [格式化程序](https://phasis.inline0.dev/zh/docs/formatter) — 按兼容 prettier 的布局格式化 JavaScript、JSON 和 CSS。
- [高级主题](https://phasis.inline0.dev/zh/docs/advanced) — 架构、字节码 VM、基准测试和预言机测试模型。
