Skip to content

Repository files navigation

PHPantom

Spookaphant
CI codecov crates

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.

Check out the documentation to get started.

Note

PHPantom is in active development. The core editing features are solid and used daily on production codebases.

Features

PHPantom focuses on deep type intelligence. Here's how it compares:

PHPantom Intelephense PHP Tools Phpactor PHPStorm
Core LSP features1
Advanced navigation2 🚧🔒 🚧 🚧
Editor extras3 🚧🔒 🚧 🚧
Diagnostics
Built-in diagnostics4 🚧🔒 🚧
External analyzer integration5 🚧 🚧
Type Intelligence
Generics / @template 🚧 🚧
Array / object shapes 🚧 🚧
Advanced PHPDoc types6 🚧🔒 🚧 🚧 🚧
Closure parameter inference 🚧 🚧 🚧 🚧
Frameworks
Laravel & Blade 🚧 🚧
Symfony & Twig 🚧 ✅🧩
Drupal 🚧
Other frameworks7 🚧 🚧 🚧 🚧 🧩
Refactoring
Rename ✅🔒 ✅🔒
Extract & generate8 🚧🔒 🚧
Simplify & modernize9 ✅🔒
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

🚧 = partial support. ❌ = not available. 🧩 = via plugin. 🔒 = paid tier. Modifiers combine with the support level: 🚧🔒 means partial, and only in the paid tier.
1 Completion, hover, signature help, go-to-definition, find references, diagnostics, document symbols, workspace symbols.
2 Call hierarchy, type hierarchy, go-to implementation / type-definition, code lens.
3 Semantic tokens, inlay hints, auto-import, smart select, folding ranges, formatting, document links.
4 Undefined and unused variables, type errors, unknown symbols and members, argument counts.
5 PHPantom runs PHPStan, PHPCS, and Mago in-server and turns their reports into quick fixes. Phpactor proxies PHPStan, Psalm, and PHP-CS-Fixer, and PHPStorm bundles PHPStan and Psalm runners, but both only relay the errors.
6 Conditional return types, type aliases (`@phpstan-type` / `@phpstan-import-type`), pseudo-types, `@mixin`.
7 WordPress, CakePHP, Doctrine, PHPUnit, Behat, and Prophecy.
8 Extract method/function, extract/inline variable, extract constant, extract interface, promote constructor parameter, generate constructor, generate getters/setters, implement interface methods.
9 Null-check simplification, string interpolation conversion, converting 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.
Independent, re-runnable type-inference conformance results across twelve PHP engines: php-typing-conformance (Qodana covers the PHPStorm engine, phpy the PHP Tools engine).

Tip

Want to verify? Open examples/php/ in your editor and trigger completion at the marked locations in completion.php. It exercises every type intelligence feature in the table, including edge cases where tools diverge. For Laravel specifically, open examples/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.

Context-Aware Intelligence

  • Smart PHPDoc completion. @throws detects uncaught exceptions in the method body, @param pre-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_map preserve element types.
  • Closure parameter inference. $users->map(fn($u) => $u->name) infers $u as User from the collection's generic context.
  • Conditional return types. PHPStan-style conditional @return types resolve to the concrete branch at each call site.
  • Type aliases and shapes. @phpstan-type, @phpstan-import-type, and object{...} shapes all resolve through to completions.
  • The full modern language. PHP 8.4 and 8.5 features resolve end-to-end: property hooks, asymmetric visibility, and the pipe operator behave like any other code.
  • 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, authorization strings resolve to the gate definition or policy method that declares them, and query string completion 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, @deprecated detection, and namespace segment drilling.

Project Awareness

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. Quick 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.php and autoload_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 .gitignore bypassed so that Composer-managed core and contrib code is always available.
  • require_once discovery. 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.
  • Workspace-wide diagnostics. After startup, diagnostics run in the background across every file in the project, not just the ones you have open, so problems are already visible when you navigate to a file. Configured external tools (PHPStan, PHPCS, Mago) run project-wide too, once the background pass finishes. Both are deferred until after startup so they never slow down time to ready.

Acknowledgements

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.

License

MIT. See LICENSE.

About

Fast PHP language server with deep type intelligence. Generics, Laravel, PHPStan annotations. Ready in an instant.

Topics

Resources

Contributing

Stars

1.2k stars

Watchers

11 watching

Forks

Releases

Contributors

Languages