shipmonk/dead-code-detector
PHPStan extension that detects and helps remove unused PHP code. Finds dead methods/properties/constants/enum cases, dead cycles and transitive dead members, even dead tested code. Supports popular frameworks like Symfony and is configurable via usage providers.
array_column() string keys (#362) improves accuracy for dynamic array access patterns, which are common in Laravel (e.g., collection manipulation, API responses).composer require --dev phpstan/phpstan).composer require --dev shipmonk/dead-code-detector).phpstan.neon setup.#[AsEventListener] annotations, route callbacks) without manual configuration. The fix for #[AsEventListener] (#356) and the new array_column() fix (#362) further reduce false negatives for dynamic Laravel code.#[AsEventListener] (#356) and array_column() (#362) reduces false negatives for Symfony/Laravel event listeners and dynamic array access. However, complex dynamic calls (e.g., app()->make() or data_get()) may still require custom MemberUsageProvider configurations.--generate-baseline).--memory-limit).--error-format removeDeadCode flag remains destructive; use cautiously (e.g., in a branch).src/ (excluding tests) or the entire codebase (including tests)?$this->someService->method() or array_column()) be handled to avoid false positives?array_column() usage) not covered by default providers?MemberUsageProvider/MemberUsageExcluder implementations be required for edge cases (e.g., legacy dynamic array access)?array_column() misclassifications) be documented and excluded (e.g., via phpstan.neon)?Route::get(fn() => ...)).#[AsEventListener] (#356).array_column() (#362) reduces false positives in collection/response handling.Phase 1: Static Analysis (Non-Destructive)
composer require --dev phpstan/phpstan shipmonk/dead-code-detector
phpstan.neon:
includes:
- vendor/shipmonk/dead-code-detector/rules.neon
parameters:
shipmonkDeadCode:
usageExcluders:
tests:
enabled: true
# Add exclusion for array_column if needed
array_column:
enabled: true
patterns:
- "array_column($responseData, 'key')"
vendor/bin/phpstan analyse --level=max
phpstan.neon.Phase 2: CI/CD Enforcement
- name: Dead Code Detection
run: vendor/bin/phpstan analyse --error-format=github
Phase 3: Automated Removal (Optional)
vendor/bin/phpstan analyse --error-format=removeDeadCode --generate-migration
app/Http/Controllers) to validate findings.app/Models, app/Console, etc., over time.MemberUsageProvider for edge cases (e.g., dynamic method calls or array_column() misclassifications).phpstan.neon may grow complex with exclusions/providers, especially with the new array_column() fix.config/phpstan/ directory.array_column:
parameters:
shipmonkDeadCode:
usageExcluders:
custom:
enabled: true
patterns:
- "array_column($this->data, 'status')"
array_column()) may break detection.DEAD_CODE_EXCEPTIONS.md file).array_column() fix in the team’s runbook.How can I help you explore Laravel packages today?