voku/phpstan-rules

Provides additional rules for phpstan/phpstan.

Maintainers

Package info

github.com/voku/phpstan-rules

Type:phpstan-extension

pkg:composer/voku/phpstan-rules

Transparency log

Statistics

Installs: 104 346

Dependents: 5

Suggesters: 0

Stars: 33

Open Issues: 3

3.7.0 2026-04-28 11:27 UTC

README

Build Status codecov.io Latest Stable Version License Donate to this project using Paypal Donate to this project using Patreon

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 != 0 is the same as (int)$foo
  • double negative boolean conditions. e.g. (bool)$foo != false is 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' or false && 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!