Javakky/phpgloss
GitHub: Javakky/phpgloss
PhpStorm 插件,补齐 IDE 对 PHPDoc 高级类型(别名、泛型、条件返回)的解析能力,使 IDE 内的类型推断与 PHPStan 保持一致。
Stars: 0 | Forks: 0
# PHPGloss
PhpStorm 会解析 PHPDoc,但并未解析全部内容。例如,type alias 会退化为 `array`,type argument 内部的 type variable 永远不会被填充,而 conditional return 会同时返回两个分支。
此插件在 IDE 中解决了这些问题,因此你看到的类型将与 PHPStan 推断出的类型保持一致。
## 它的功能
### 类型别名
`@phpstan-type` 和 `@phpstan-import-type` 为一个 shape 声明了一个名称。PhpStorm 会解析它们,但不会传递该 shape。
| | 仅 PhpStorm | 搭配此插件 |
|---|---|---|
| 悬停在 alias 上 | 无反应 | 它所代表的 shape |
| 在引用上按 Ctrl+B | 未找到声明 | 跳转至声明 |
| 在声明上按 Ctrl+B | 未找到声明 | 列出使用情况 |
| 对导入的 shape 进行键访问 | `mixed` | 该键的类型,并带有补全 |
| `@return list` | `list` | 该 alias 名称,并链接至其声明 |
在 interface 或 trait 上声明的 alias,其工作方式与在 class 上声明的一样——query port 是通常编写这些内容的地方。
```
/**
* @phpstan-type row_shape array{user_id: positive-int, user_name: non-empty-string}
*/
interface RecordPort
{
/** @return list */
public function getUsers(): array;
}
```
### 类型推断
PhpStorm 会从调用的参数中解析 type variable,但在某些地方会停止。这些情况在这里都得到了解决。
| 写法 | 仅 PhpStorm | 搭配此插件 |
|---|---|---|
| `@return Op` | `Op<#V>` | `Op<\App\User>` |
| `@param callable(V, K): E` | `E` 未解析 | 从闭包的返回类型绑定 |
| 对 `list` 进行 `foreach` | `mixed\|array` | 该 shape |
| `($mode is Shape::LIST ? list : array)` | 两个分支同时返回 | 参数所选择的分支 |
| `@return V\|null` | 仅 `V` | 保留 null |
| `@var list` | 扁平化为 `int` | 保留 `positive-int` |
| 函数内部的 `$callback($value)` | 无类型 | 返回类型变量的绑定 |
| `[Region::NORTH => …]` | 整数键 | 常量自身的类型 |
Conditional return types 可以嵌套,并且嵌套会被追踪——真实代码中会用到三层嵌套。如果参数无法决定某个分支,则保留原样:没有类型也比错误的类型好。
### 类型关键字
虽然不如上面两项常用,但当你遇到不熟悉的关键词时,它就能派上用场。
PHPStan 和 Psalm 保留的 84 个关键词——`non-empty-string`、`positive-int`、`class-string`、`int-mask-of` 等——在 IDE 中没有任何意义。现在悬停在关键词上会显示其解释,并且按下 Ctrl+B 会打开定义它的代码:优先打开项目的 `vendor/` 中的副本,如果没有,则打开内置的源代码。
描述信息直接来自上游类本身(Psalm 的 `Type\Atomic\T*` docblock,PHPStan 的 `Type\Accessory\*`),并且当 IDE 设置为日语时,描述也会以日语显示。
仅在实际编写了类型的地方生效。提及 `list` 的文字描述,以及 `@phpstan-import-type` 的 `as`,将保持原样。
## 安装
从发布页面下载 ZIP 文件,并使用 **Settings → Plugins → ⚙ → Install Plugin from Disk**(从磁盘安装插件),或者自行构建:
```
./gradlew buildPlugin # build/distributions/*.zip
```
## 支持的 IDE
PhpStorm 2025.1 及更高版本,以及带有 PHP 插件的 IntelliJ IDEA Ultimate。已在 PhpStorm 2025.1、2025.2、2026.1、2026.2 和 IntelliJ IDEA Ultimate 2026.2 上验证。
该插件不运行任何外部进程,也不发起任何网络请求。它不运行 PHPStan。
## 已知限制
- 类型引用会在 `@param`、`@return`、`@var` 及其 `@phpstan-` 形式中被读取。其他标签不会被扫描。
- Alias 会从 class、interface、trait 和 enum 的 PHPDoc 中读取。不支持 Method、function 和文件级别的 alias,并且隐式继承的 alias 也不会被解析。
- 不读取来自 PHPStan 配置文件的 `typeAliases`。
- 没有 `of` 绑定的 type variable 无法在声明它的函数内部显示。PHPStan 会输出 `E (function …)`;而 IDE 无法表达这一点。
- 通过 `foreach` 获取的 shape 会显示为 shape,但对其进行键访问仍然会解析为 `mixed`。PhpStorm 将 shape 保存在其自身的表示形式中,并且不会从以文本形式编写的类型中读取它们。
- 渲染文档的说明和 Find Usages 依赖于实验性的平台 API。它们可能会在未来的 IDE 中失效;插件的其余部分不依赖于它们。
## 开发说明
需要 Java 25 —— 平台和 PHP 插件的 JAR 文件是 Java 25 字节码,旧版本的 JDK 无法读取它们。
```
JAVA_HOME=/path/to/jdk-25 ./gradlew test
./gradlew verifyPlugin # every supported IDE build
./gradlew runIde
```
`tools/conformance` 会测量推断结果与 PHPStan 本身的一致性:它会收集 PHPStan 为真实项目中每个变量赋值推断出的类型,然后进行比较。有关如何运行它的说明,请参阅其 README;它需要一个带有 `vendor/bin/phpstan` 的 PHP 项目,因此它不是 CI 的一部分。
## 许可证
MIT。内置的 Psalm 和 PHPStan 源代码同样采用 MIT 许可证;请参阅 `NOTICE`。
标签:JS文件枚举, OpenVAS, PHP, PhpStorm插件, SOC Prime, 云安全监控, 后台面板检测, 域名枚举, 开发工具, 类型推断, 静态分析