A fast, lightweight PHP language server written in Rust. Ready in seconds, uses a fraction of the RAM other language servers need, and stays responsive throughout. No indexing phase, no waiting.
Note
PHPantom is in active development. The core editing features are solid and used daily on production codebases.
PHPantom focuses on deep type intelligence. Here's how it compares:
| PHPantom | Intelephense | PHP Tools | Phpactor | PHPStorm | |
|---|---|---|---|---|---|
| Common LSP features1 | ✅ | ✅ | ✅ | ✅ | ✅ |
| Workspace symbols | 🚧 | ✅ | ✅ | ✅ | ✅ |
| Call hierarchy | ❌ | ❌ | ❌ | ❌ | ✅ |
| Semantic tokens | ✅ | ❌ | ✅ | ❌ | ✅ |
| Linked editing | ✅ | ❌ | ✅ | ❌ | ✅ |
| Extras2 | ✅ | 💰 | 🚧 | 🚧 | ✅ |
| Diagnostics | |||||
| PHPStan integration | ✅ | ❌ | ❌ | 🚧 | 🚧 |
| Undefined variable | ✅ | 💰 | ✅ | ✅ | ✅ |
| Type errors | ✅ | 💰 | ✅ | 🚧 | ✅ |
| Unused variable | ✅ | ❌ | ✅ | ❌ | ✅ |
| Type Intelligence | |||||
Generics / @template |
✅ | 🚧 | ✅ | 🚧 | ✅ |
@mixin completion |
✅ | 💰 | ✅ | ✅ | 🚧 |
| Array / object shapes | ✅ | ✅ | ✅ | 🚧 | 🚧 |
| PHPStan types | ✅ | ❌ | 🚧 | 🚧 | 🚧 |
| Conditional return types | ✅ | ❌ | ✅ | 🚧 | ❌ |
| Closure parameter inference | ✅ | 🚧 | 🚧 | 🚧 | 🚧 |
| Laravel | ✅ | ❌ | 🚧 | ❌ | 🚧 |
| Blade templates | 🚧 | ❌ | ✅ | ❌ | ✅ |
| Other frameworks4 | 🚧 | 🚧 | 🚧 | 🚧 | 🧩 |
| Refactoring | |||||
| Rename | ✅ | 💰 | 💰 | ✅ | ✅ |
| Common refactorings3 | ✅ | ❌ | 💰 | ✅ | ✅ |
| Extract constant | ✅ | ❌ | ❌ | ✅ | ✅ |
| Extract interface | ✅ | ❌ | ❌ | ✅ | ✅ |
| Promote constructor parameter | ✅ | ❌ | ❌ | ❌ | ✅ |
| Simplify expressions | ✅ | ❌ | 💰 | ❌ | ✅ |
| Modernize syntax5 | ✅ | ❌ | 💰 | ❌ | ✅ |
| Performance | |||||
| Time to ready | 5 s | 1 min 25 s | 3 min 17 s | 15 min 39 s | 17 min 55 s |
| RAM usage | 360 MB | 520 MB | 3.9 GB | 498 MB | 1.7 GB |
| Disk cache | 0 | 45 MB | 0 | 4.1 GB | 551 MB |
1 Completion, hover, signature help, go-to-definition, find references, diagnostics, document symbols.
2 Auto-import, go-to implementation / type-definition, smart select, folding ranges, formatting, code lens, inlay hints, type hierarchy, document links.
3 Implement interface methods, extract method/function, extract/inline variable, generate constructor, generate getter/setter.
4 CakePHP, non-Composer WordPress, Symfony, Behat, PHPUnit, and Prophecy, and Twig.
5 Convert between arrow functions and closures, and switch statements to match expressions.
Performance measured on a production codebase: 21K PHP files, 1.5M lines of code (vendor + application). Time to ready is CPU time consumed until full type intelligence is available on a cold start (first index); tools with a disk cache launch faster on subsequent starts.
Want to verify? Open
examples/demo.phpin your editor and trigger completion at the marked locations. It exercises every type intelligence feature in the table, including edge cases where tools diverge. For Laravel specifically, openexamples/laravel/— a standalone project with real Eloquent models, config, routes, views, and translations that exercises Eloquent property resolution, query builder chaining, scopes, custom collections, and go-to-definition for config keys, route names, and translation strings.
- Smart PHPDoc completion.
@throwsdetects uncaught exceptions in the method body,@parampre-fills from the signature, and tags are filtered to context and never suggested twice. - Array shape inference. Literal arrays offer key completion with no annotation. Nested shapes, spreads, and array functions like
array_mappreserve element types. - Closure parameter inference.
$users->map(fn($u) => $u->name)infers$uasUserfrom the collection's generic context. - Conditional return types. PHPStan-style conditional
@returntypes resolve to the concrete branch at each call site. - Type aliases and shapes.
@phpstan-type,@phpstan-import-type, andobject{...}shapes all resolve through to completions. - Laravel. Eloquent relationships, scopes, accessors, casts, and Builder chains resolve end-to-end. Macros behave like real methods. Container strings like
app('cache')resolve to the bound class,auth()->user()resolves to your configured model, and query string compleation on both relation and column names. Blade templates get completion, hover, go-to-definition, and diagnostics through virtual PHP preprocessing. No ide-helper or database access required. - Everything else you'd expect. Generics, type narrowing, named arguments, destructuring, first-class callables, anonymous classes,
@deprecateddetection, and namespace segment drilling.
PHPantom understands Composer projects out of the box, but works without setup on non-Composer projects too:
- Autoloader-accurate results. Completions and go-to-definition only surface classes that Composer's autoloader can actually load, avoiding false positives from internal, inaccessible, or duplicate vendor classes. You see exactly what your application can use.
- PSR-4 correctness. Qucik fixes for when the namespace or class name does not match their PSR-4 path.
- PSR-4 autoloading. Resolves classes across files on demand.
- Classmap and file autoloading.
autoload_classmap.phpandautoload_files.php. - Embedded PHP stubs from phpstorm-stubs bundled in the binary, no runtime downloads needed.
- Drupal project support. Detects Drupal projects via
composer.json, resolves the web root, and indexes Drupal-specific directories and PHP extensions (.module,.install,.theme, etc.) with.gitignorebypassed so that Composer-managed core and contrib code is always available. require_oncediscovery. Functions from required files are available for completion.- Go-to-implementation. Jump from an interface or abstract class to all concrete implementations. Scans open files, classmap, PSR-4 directories, and embedded stubs.
- Installation. Editor-specific setup for Zed, Neovim, PHPStorm, and others.
- CLI Reference. Batch diagnostics (
analyze), automated fixes (fix), and CI integration. - Building from Source. Build, test, and debug instructions.
- Architecture. Symbol resolution, stub loading, and inheritance merging.
- Contributing
- Changelog
- Benchmarks. Latency and memory usage tracked on every commit.
- Roadmap. Planned features and domain-specific plans.
PHPantom stands on the shoulders of:
- Mago: the PHP parser that powers all of PHPantom's AST analysis.
- PHPStan and Psalm: for their pioneering work in PHP static analysis and shaping the type ecosystem. PHPantom builds on PHPStan-informed type experience, with full support for
@phpstan-*annotations. - JetBrains phpstorm-stubs: type information for the entire PHP standard library, embedded directly into the binary.
- Phpactor: the PHP language server whose comprehensive test suite and benchmark fixtures informed PHPantom's own test coverage. Many of PHPantom's type inference fixtures were adapted from Phpactor's reflection tests.
MIT. See LICENSE.