Sublime Text 默认不支持 PHP 8 新特性,必须配置 intelephense 语言服务器:需全局安装、正确设置 LSP command 和 intelephense.json(含精确 phpVersion 字符串与 standard stub)、绑定 PHP 语法、禁用冲突插件。

Sublime Text 本身不原生支持 PHP 8 的类型语法(如 mixed、static 返回类型、never、属性提升、泛型占位符等),所有“智能提示”能力都依赖插件+外部语言服务器或分析器——没配对,PHP 8 的新特性就等于不存在。
为什么 PHP 8 的类型提示在 Sublime 里不显示?
根本原因是:默认的 PHP 插件(如 PHPIntel、SublimeCodeIntel)基于老旧的解析逻辑,无法识别 PHP 8.0+ 引入的语法节点。比如写 function foo(): static,老插件会直接跳过返回类型,补全时也看不到 static 成员;写 class C<T>,连类名都可能标红报错。
解决路径只有一条:换用能真正解析 PHP 8 AST 的后端。目前唯一稳定可用的是 intelephense(非开源但免费基础版已足够),它从 1.8 版本起完整支持 PHP 8.3 的全部类型语法。
-
intelephense必须通过 npm 全局或项目本地安装:npm install -g intelephense - 确保 PATH 可访问:
intelephense --version在终端能正常输出(Windows 用户注意:不要用 PowerShell 默认策略限制,改用 CMD 或设Set-ExecutionPolicy RemoteSigned -Scope CurrentUser) - LSP 配置中
command必须写成数组形式:["intelephense", "--stdio"],不能漏掉--stdio - 必须在项目根目录放
intelephense.json(哪怕空文件),否则降级为 PHP 7 兼容模式,readonly属性、enum成员全不可见
PHP 8 的 enum 和 match 补全失效?检查 scope 和 syntax 关联
即使 intelephense 运行正常,enum Status { case Pending; } 依然不提示成员,大概率是 Sublime 没把当前文件识别为 PHP —— 尤其常见于 .php 文件混写 HTML 时,syntax fallback 成了 text.html.basic,LSP 根本不触发。
立即学习“PHP免费学习笔记(深入)”;
验证方式:按 Ctrl+Alt+Shift+P(Win/Linux)或 Cmd+Alt+Shift+P(macOS),看命令面板顶部是否显示 source.php。若显示 text.html.basic 或 text.plain,说明语法绑定失败。
- 手动设置语法:右下角点击当前语言名 → 选
PHP(不是HTML或PHP (HTML)) - 永久修复:打开
Preferences → Settings – Syntax Specific,填入:{"extensions": ["php"]},并确保Packages/PHP/PHP.sublime-syntax存在且未被覆盖 - 对
.php中嵌套 HTML 的场景,推荐启用extensions_to_syntax映射(ST4+):"extensions_to_syntax": {"php": "Packages/PHP/PHP.sublime-syntax"},比旧版files.associations更可靠
PHP 8.2+ readonly 属性和 __serialize() 不提示?确认 intelephense 版本与配置
intelephense 1.8.0+ 才开始支持 readonly 语义分析,但默认配置会忽略未声明类型的属性。如果你写了 readonly public $id; 却看不到补全,不是插件问题,而是配置没开“严格模式”。
在 intelephense.json 中必须显式启用:
{
"intelephense.environment.phpVersion": "8.3",
"intelephense.stubs": ["php", "standard", "json", "mysqli"],
"intelephense.files.exclude": ["**/vendor/**", "**/node_modules/**"]
}
关键点:"intelephense.environment.phpVersion" 必须设为字符串格式的精确版本号(如 "8.3"),不能写 8.3(数字类型会被忽略);"intelephense.stubs" 缺少 "standard" 会导致 __serialize()、__unserialize() 等魔术方法不可见。
另外注意:如果项目用了 Composer autoload,intelephense 默认不扫描 vendor/autoload.php,需在 intelephense.json 中加:"intelephense.environment.includePaths": ["vendor"],否则第三方包里的 enum 或 readonly 类照样不提示。
LSP 启动成功但补全卡顿?关闭 PHPIntel 或 SublimeCodeIntel
多个 PHP 补全插件共存是性能杀手。尤其 PHPIntel 和 SublimeCodeIntel 会各自扫描整个项目、构建独立索引库,与 intelephense 的 LSP 流程完全冲突——结果就是 CPU 占用飙高、输入延迟明显、悬停提示消失。
- 禁用方式:菜单
Preferences → Package Control → Disable Package,选PHPIntel和SublimeCodeIntel - 别信“同时开启更全”的说法:它们底层无共享缓存,也不互通 AST,纯属重复劳动
- 若曾用
SublimeCodeIntel建过索引,建议手动删掉~/.codeintel/db(macOS/Linux)或%userprofile%\.codeintel\db(Windows),避免残留锁文件干扰
PHP 8 的语法复杂度远超早期版本,任何试图用“轻量插件”硬扛新特性的做法都会在 enum 成员、never 返回值、属性提升这些地方露出马脚。真正省事的做法,是接受 LSP + intelephense 这一组合的事实标准,并把配置抠到每个字段级——版本号字符串、exclude 路径斜杠方向、JSON 键名大小写,错一个就退化。



















