PHP 是门生锈的语言吗?用 Rust 与 Go 解析 PHP 的探索
Is PHP a Rusty Language?
作者对比了 PHPStan 与 Rust 编写的 Mago:Mago 解析整个 PHP 代码库仅需 3 秒,而 PHPStan 约需 60 秒。因 Mago 要求 PHP 8.1,无法用于 PHP 7.2-7.4 的遗留项目,作者转向 Go,发现 2018 年已有比 php-parser 快 11 倍的 Go 版 PHP 解析器。
你还记得 Mago 1.0 吗?

我记得,我查过 PHPStan 与 Mago 的功能对比,但没找到。我想知道是否存在某种 约 80% 的规则对等性,那会是一个明确的“太棒了,必须试试!”。
我当时不了解 Rust,以为它是一种面向硬核开发者、研究人员或硬件人士的底层语言。突然之间,它能在 3 秒内解析整个 PHP 代码库!
PHPStan 运行了大约 60 秒,而 Rust 只花了几秒。这怎么可能?他们肯定在作弊或者做了什么手脚。有些工具假装快得飞起,然后你发现它们只是用了缓存。这就像说这辆车是世界上最快的车……前提是你从不在有红绿灯的街道上开它。
大约在 2026 年 7 月,Mago 再次引起了我的注意。我当时非常怀疑——典型的“如果这是真的,早就有人几年前写出来了”。但我对 Rector 也持同样的怀疑态度将近半年,直到我发布了第一个公开版本。
在 10 秒内对遗留 PHP 进行静态分析?
我的工作 完全专注于遗留代码库,我们一直让 PHPStan 运行 60-120 秒。运行它、修复问题都很痛苦,更别提自定义规则了。级别很少有用,因为遗留项目到处都是 mixed 类型。PHPStan 在你达到更高级别之前不会检查 mixed 类型,而我们无法达到更高级别,因为我们没有任何类型。忽略错误正是让项目陷入这种混乱的原因,所以基线也不是办法。先有鸡还是先有蛋的问题。
我们需要的只是找出不存在的方法(天哪,漏掉了好多),所以我们制定了自定义规则,比如 no mixed caller。仅这一条规则就在 level 0 之前帮我们避免了大量 bug。
用 PHPStan 这样的工具实现这一点简直是地狱,还要运行在 PHP 7.2-7.4 上,所以我研究了 Mago。不幸的是,它出于某种原因需要 PHP 8.1,所以行不通。
不过,我的直觉告诉我,它有着深层的价值……PHP 社区里怎么只有一个人——azjezz——看到了这一点?
欢迎外语
我研究了 Mago 的代码库,完全看不懂。在我看来像是 Java+PHP。但它的速度仍然足够诱人,让我至少学一点这门语言。依赖、crate、它们如何发布。显然,之前甚至没有人尝试过用 Rust 解析 PHP。Mago 早在 agents 出现之前就构建了,所以这些人肯定投入了数百小时才让它运转起来。
我想做一个能在任何 PHP(5.6-8.5)上运行、并能快速解决一个问题的原型。这是这两个工具都做不到或不会尝试去做的事情。有人告诉我必须使用完整的 mago(或 crate)才能做到这一点。这感觉成本太高了,就像只是为了创建一个控制台命令而使用整个 Symfony。
这行不通。没有其他工具用 Rust 解析 PHP 并且还活着。嗯……
Rust……还是 Go?
然后我和我的新房东进行了一次短暂的偶遇聊天,不到 3 分钟,却即将改变我接下来几年的生活:
- “我也是开发者。”
- “哦,你做什么的?”
- “PHP”
- “你呢?”
- “Go”
“Go”……对于这个用例来说,它甚至算得上有用的语言吗?
我简单看了一下,发现它非常简单:
- 没有方法,
- 没有类,
- 没有
public/private
它只有 25 个关键字,而 PHP 有 71 个。我能学会!
与过去的我争论
立刻搜索“php-parser go”,我发现有人已经在 8 年前写了一个解析器。在那篇帖子下面,有年轻时的我在争论说用 PHP 做同样的工作更好。这打脸来得真快。

令我惊讶的是,这个仓库仍然可用:https://github.com/z7zmey/php-parser,在 2018 年它就已经比 php-parser 快 11 倍。

我研究了一下学习 Golang:
- 买了两本纸质书,连续几周睡前阅读,
- 读了这篇由 Phpactor 背后的 PHP 开发者撰写的精彩总结,其中用清晰简短的代码片段展示了语法差异,
- 看了大部分会议视频
- 甚至买了一张 GopherCon UK 的门票。
有三点很突出:
- 2007 年在 Google 创造,只要 3 位创始开发者达成一致就能交付功能——没有投票,无需等待,但也不会有粗制滥造
- 它开箱即用地支持 Goroutines,类似并行编程——无需额外包,无需额外知识,只需 2 个关键字
- 静态分析位于语言核心——是的,没有额外工具,没有单元测试运行器,没有 PHPStan 也没有 Rector——它们全都在主二进制文件中
这门语言没有炒作,但有一个用它写的 php-parser。它从 2018 年就存在了,分支很少,一年前有人发布了使用 go 解析 PHP 的另一种方式。也许,只是也许……这是一个迹象,表明这门语言可能非常适合解析 PHP。
对速度的需求
“所以这门语言比 PHP 快,那又怎样?我们应该把所有项目都切换过去吗?”
不,更快的语言并不意味着我们必须把所有代码都重写过去。
“那它有什么用?”
我们可以利用速度来大幅改善开发者和智能体体验。
如何以及何时?
- Mago 在过去一年是如何改进静态分析的?
- 它又是如何意外地让 PHPStan 快了 3 倍?
- 我们能在 Rust 中做静态分析吗?
- 那个已经沉寂 6 年的 Golang 解析器怎么样?
- 你自己能用 Golang 解析器做什么?
我们将在后续部分探讨这些问题以及更多内容。
编码愉快!
来源:Hacker News · tomasvotruba.com