php-stubs/generator
Generate PHP stub files from your codebase for better IDE autocomplete, static analysis, and documentation. php-stubs/generator scans sources and produces lightweight stubs suitable for packages and frameworks, helping consumers get accurate type hints without shipping full sources.
Install the Package Add to your project via Composer:
composer require --dev php-stubs/generator
Why --dev? Stubs are a development tool, not runtime dependency.
First Use Case: Stub a Vendor Library
Generate stubs for a third-party package (e.g., monolog/monolog) in vendor/:
./vendor/bin/generate-stubs vendor/monolog/monolog --out=stubs/monolog.stub.php
Use case: Enable IDE autocompletion and PHPStan analysis for untyped libraries.
Where to Look First
./vendor/bin/generate-stubs --help for options.app/ (custom logic)vendor/ (third-party packages)config/ (global variables like config('app.timezone'))./vendor/bin/generate-stubs app/Models --out=stubs/app-models.stub.php --include=Classes,Functions
stubs/ (version-controlled).File > Settings > PHP > Include Paths)../vendor/bin/generate-stubs vendor/laravel/framework --out=stubs/framework.stub.php
phpstan analyse app --level=max --generate-baseline
phpstan/extension-installer to auto-load stubs.- name: Generate and validate stubs
run: |
./vendor/bin/generate-stubs app/ vendor/ --out=stubs/all.stub.php
php -r "require 'stubs/all.stub.php'; echo 'Stub generation successful';"
Str::of())../vendor/bin/generate-stubs vendor/laravel/framework/src/Illuminate/Support --out=stubs/illuminate.stub.php --include=Classes,Functions
Str::macro()) may require manual stub adjustments../vendor/bin/generate-stubs app/Http/Controllers --out=stubs/controllers.stub.php --include=Classes
Stub Facades and Helpers
Use --include=Functions to capture Laravel’s global helpers (e.g., route(), view()):
./vendor/bin/generate-stubs vendor/laravel/framework/src/Illuminate/Support/helpers.php --out=stubs/helpers.stub.php
Service Provider Stubs
Stub register()/boot() methods to enable IDE navigation in AppServiceProvider:
./vendor/bin/generate-stubs app/Providers --out=stubs/providers.stub.php
Eloquent Relationships
Generate stubs for dynamic relationships (e.g., hasManyThrough) to improve IDE support:
./vendor/bin/generate-stubs app/Models --out=stubs/eloquent.stub.php --include=Classes
PHPStan Extension
Install phpstan/extension-installer to auto-load stubs:
composer require --dev phpstan/extension-installer
Configure phpstan.neon:
includes:
- stubs/
PhpStorm Configuration
File > Settings > PHP > Include Paths.stubs/ as a mapped path for your project.VSCode (Intelephense)
Add to .vscode/settings.json:
{
"intelephense.environment.php.get": {
"stubs": ["stubs/**/*.stub.php"]
}
}
False Positives in Static Analysis
--nullify-globals to avoid stubbing uninitialized globals:
./vendor/bin/generate-stubs app/ --out=stubs/app.stub.php --nullify-globals
arguments.rules.*.level = 'ignore'
Dynamic Class Loading
--visitor for custom parsing:
./vendor/bin/generate-stubs vendor/laravel/framework --visitor=CustomVisitor
Duplicate Stubs
app/ and vendor/).--deduplicate (if available) or merge stubs manually.IDE-Specific Quirks
Performance
app/ in development, vendor/ in CI).Validate Stubs
Use PHP’s token_get_all() to verify stub syntax:
$stubCode = file_get_contents('stubs/app.stub.php');
token_get_all($stubCode); // Should not throw errors
Compare with Original Diff stubs against the original code to spot missing or incorrect declarations:
diff -u <(grep -A 5 "function foo" app/OriginalFile.php) <(grep -A 5 "function foo" stubs/app.stub.php)
Log Parsing Errors Enable verbose output to debug parsing issues:
./vendor/bin/generate-stubs app/ --verbose
Custom Visitors
Extend stub generation with a custom StubsGenerator\Visitor for Laravel-specific logic (e.g., stubbing Route::macro() calls):
use StubsGenerator\{StubsGenerator, Visitor\NodeVisitor};
class LaravelMacroVisitor extends NodeVisitor {
public function enterNode() { /* Custom logic */ }
}
$generator = new StubsGenerator();
$generator->addVisitor(new LaravelMacroVisitor());
Post-Processing Stubs
Use PHP’s php -r to filter or transform stubs after generation:
./vendor/bin/generate-stubs app/ --out=stubs/raw.stub.php && \
php -r "file_put_contents('stubs/filtered.stub.php', preg_replace('/@deprecated/', '', file_get_contents('stubs/raw.stub.php')));"
Git Hooks for Stub Sync Automate stub updates with a pre-commit hook:
echo '#!/bin/bash
./vendor/bin/generate-stubs app/ --out=stubs/app.stub.php
git add stubs/app.stub.php
' > .git/hooks/pre-commit
chmod +x .git/hooks/pre-commit
config() and env()
Globals like config('app.timezone') may not stub correctly. Use --nullify-globals or manually stub:
// Manually add to stubs.php
/** @var string */
$appTimezone = null;
How can I help you explore Laravel packages today?