voku / phpstan-rules
Provides additional rules for phpstan/phpstan.
Package info
Type:phpstan-extension
pkg:composer/voku/phpstan-rules
Requires
- php: ^7.4 || ^8.0
- phpstan/phpstan: ~2.0
Requires (Dev)
- phpstan/phpstan-phpunit: ~2.0
- phpunit/phpunit: ~7.0 || ~9.0
This package is auto-updated.
Last update: 2026-08-28 19:59:34 UTC
README
phpstan-rules
Provides additional rules for phpstan/phpstan.
Installation
Run
$ composer require --dev voku/phpstan-rules
Usage
All the rules provided (and used) by this library are included in rules.neon.
When you are using phpstan/extension-installer, rules.neon will be automatically included.
Otherwise, you need to include rules.neon in your phpstan.neon:
includes: - vendor/voku/phpstan-rules/rules.neon
Rules
IfConditionHelper
This helper is used by different "condition"-rules: if - and - or - not - ternary
💡 We use this "hack" (helper) to run the check for all kind of conditions.
- double negative string conditions. e.g.
(string)$foo != ''is the same as(string)$foo - double negative integer conditions. e.g.
(int)$foo != 0is the same as(int)$foo - double negative boolean conditions. e.g.
(bool)$foo != falseis the same as(bool)$foo - double negative null conditions. Use "!==" instead if needed
- check 0 vs '' conditions, the behavior was changed in PHP 8
- check possible insane comparisons. e.g.
0 == '0foo', the behavior was changed in PHP 8 - check insane comparisons. e.g.
0 === '0'orfalse && true - check non-empty string is never empty
- check non-empty string is always empty
- check non-empty array is never empty
- do not compare objects with another type
- do not use magic string-concat for objects with "__toString()"
- do not allow assignments. e.g.
if ($a = 0)(see "checkForAssignments") - do not allow Yoda conditions. e.g.
ìf (0 == $a)(see "checkYodaConditions")
Configuration
If you want to configure a list of classes / subclasses that can NOT be used in conditions directly:
e.g.:
- ok:
if ($emailValueObject->isValid()) - error:
if ($emailValueObject != '')
parameters: voku: classesNotInIfConditions: [ AbstractValueObject ]
If you want to check assignments e.g. in "if"-conditions you can use this:
parameters: voku: checkForAssignments: true
If you want to check Yoda conditions can use this:
parameters: voku: checkYodaConditions: true
The default keeps this extension's historical comparison output. If your PHPStan level already reports constant loose comparisons, you can suppress only the duplicated generic truth claim while keeping the extension-specific PHP 7/8 and style advice:
parameters: voku: reportDuplicateNativeComparisons: false
Duplicate suppression follows PHPStan's own treatPhpDocTypesAsCertain and reportAlwaysTrueInLastCondition parameters. If PHPStan would not publish the native finding under the active configuration, this extension keeps its diagnostic instead of guessing. Trait contexts also fail open until the contextual trait follow-up in issue #74 is resolved.
ExtendedBinaryOpRule
This rule will check "+", "*", "/", "-", ... (operators) and "." (concatenation) for compatible types.
It's included in the default rules.neon so that you don't need to add it manually.
DisallowedCallMethodOnNull
This code is copy&pasted from [phpstan/phpstan-src] and I used it to prevent Call to a member function on null errors while I wasn't already on level 8 where all kind of "NULL" checks are already covered by default.
e.g.
rules: - voku\PHPStan\Rules\DisallowedCallMethodOnNullRule
InArrayLooseComparisonRule
This opt-in rule detects the PHP 7 -> PHP 8 loose-comparison hazard in in_array() and array_search() when a definite int/float is compared with a definite non-numeric string through a typed, non-constant haystack.
It is deliberately not part of rules.neon: strict mode, numeric strings, mixed/union types, unknown strict flags and constant haystacks remain outside its reporting surface.
rules: - voku\PHPStan\Rules\InArrayLooseComparisonRule
Support
For support and donations please visit Github | Issues | PayPal | Patreon.
For status updates and release announcements please visit Releases | Twitter | Patreon.
For professional support please contact me.
Thanks
- Thanks to GitHub (Microsoft) for hosting the code and a good infrastructure including Issues-Managment, etc.
- Thanks to IntelliJ as they make the best IDEs for PHP and they gave me an open source license for PhpStorm!
- Thanks to Travis CI for being the most awesome, easiest continous integration tool out there!
- Thanks to StyleCI for the simple but powerfull code style check.
- Thanks to PHPStan && Psalm for relly great Static analysis tools and for discover bugs in the code!