Provides additional rules for phpstan/phpstan.
Run
$ composer require --dev voku/phpstan-rulesAll 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.neonThis 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")
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: trueIf you want to check Yoda conditions can use this:
parameters:
voku:
checkYodaConditions: trueThe 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: falseDuplicate 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.
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.
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\DisallowedCallMethodOnNullRuleThis 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\InArrayLooseComparisonRuleFor 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 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!