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, 云安全监控, 后台面板检测, 域名枚举, 开发工具, 类型推断, 静态分析