Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Phpstan Rules Laravel Package

voku/phpstan-rules

Additional PHPStan rules to catch risky and redundant condition logic and comparisons. Detects double negatives, PHP 8 behavior changes (0 vs ''), insane/invalid comparisons (0=='0foo', 0==='0'), and type-mismatch checks (e.g., object vs non-object).

View on GitHub
Deep Wiki
Context7

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

:bulb: 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

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

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!
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
davejamesmiller/laravel-breadcrumbs
artisanry/parsedown
christhompsontldr/phpsdk
enqueue/dsn
bunny/bunny
enqueue/test
enqueue/null
enqueue/amqp-tools
milesj/emojibase
bower-asset/punycode
bower-asset/inputmask
bower-asset/jquery
bower-asset/yii2-pjax
laravel/nova
spatie/laravel-mailcoach
spatie/laravel-superseeder
laravel/liferaft
nst/json-test-suite
danielmiessler/sec-lists
jackalope/jackalope-transport