website/src/user-guide/ignoring-errors.md
You might want to ignore some errors found by PHPStan for various reasons:
Please note that some selected serious errors (like autoloading issues, parent class not found, parse errors, etc.) cannot be ignored and must be solved to get to zero errors when running PHPStan.
</div>Errors can be ignored next to the violating line of code using @phpstan-ignore PHPDoc tag. All the PHP comment styles (//, /* */, /** */) can be used.
function () {
/** @phpstan-ignore variable.undefined */
echo $foo;
echo $foo; /** @phpstan-ignore variable.undefined */
/* @phpstan-ignore variable.undefined */
echo $foo;
echo $foo; /* @phpstan-ignore variable.undefined */
// @phpstan-ignore variable.undefined
echo $foo;
echo $foo; // @phpstan-ignore variable.undefined
};
The @phpstan-ignore comment requires an error identifier of the error you want to ignore. If the comment is the only thing on its line besides whitespace, it will look for an error to ignore on the next line. Otherwise it will ignore an error on its own line.
function () {
// @phpstan-ignore argument.type
$this->foo->doSomethingWithString(1);
$this->foo->doSomethingWithString(2); // @phpstan-ignore argument.type
};
Multiple errors can be ignored with comma-separated identifiers. Multiple errors with the same identifier can also be ignored the same way:
echo $foo, $bar; // @phpstan-ignore variable.undefined, variable.undefined
You can find out the error identifier for the error you're trying to ignore:
table formatter. It will show the identifier next to πͺͺ icon.The reason why a certain error is ignored using @phpstan-ignore can be put into parentheses after the identifier:
echo $foo; // @phpstan-ignore variable.undefined (Because we are lazy)
You can also choose to ignore all errors on a specific line using @phpstan-ignore-line and @phpstan-ignore-next-line.
echo $foo; // @phpstan-ignore-line
// @phpstan-ignore-next-line
echo $foo;
If your codebase is currently full of @phpstan-ignore-line & @phpstan-ignore-next-line and you'd like to switch to identifier-specific @phpstan-ignore, you can use automatic migration wizard in PHPStan Pro{.phpstan-pro-label} that will do it for you:
Try out PHPStan Pro{.phpstan-pro-label} by running PHPStan with --pro or by going to account.phpstan.com and creating an account.
Errors can be ignored by adding a regular expression to the configuration file under the ignoreErrors key. To ignore an error by a regular expression in the whole project, add a string entry:
parameters:
ignoreErrors:
- '#Call to an undefined method [a-zA-Z0-9\\_]+::doFoo\(\)#'
- '#Call to an undefined method [a-zA-Z0-9\\_]+::doBar\(\)#'
To ignore errors by a regular expression only in a specific file, add an entry with message or messages and path or paths keys. Wildcard patterns compatible with the PHP fnmatch() are also supported. You can specify how many times the error is expected by using count (optional, applies only to message not messages and path, not paths).
parameters:
ignoreErrors:
-
message: '#Access to an undefined property [a-zA-Z0-9\\_]+::\$foo#'
path: some/dir/SomeFile.php
-
message: '#Call to an undefined method [a-zA-Z0-9\\_]+::doBar\(\)#'
paths:
- some/dir/*
- other/dir/*
-
messages:
- '#Call to an undefined method [a-zA-Z0-9\\_]+::doFooFoo\(\)#'
- '#Call to an undefined method [a-zA-Z0-9\\_]+::doFooBar\(\)#'
path: other/dir/AnotherFile.php
-
messages:
- '#Call to an undefined method [a-zA-Z0-9\\_]+::doFooFoo\(\)#'
- '#Call to an undefined method [a-zA-Z0-9\\_]+::doFooBar\(\)#'
paths:
- some/foo/dir/*
- other/foo/dir/*
-
message: '#Call to an undefined method [a-zA-Z0-9\\_]+::doFoo\(\)#'
path: other/dir/DifferentFile.php
count: 2 #Β optional
- '#Other error to ignore everywhere#'
Relative paths in the path and paths keys are resolved based on the directory of the config file is in. So if your phpstan.neon is in the root directory of the project, and you want to ignore an error in src/Foo/Bar.php, your path key can simply be src/Foo/Bar.php.
If you want to ignore only a specific error, you can take advantage of error identifiers in the identifier key:
parameters:
ignoreErrors:
-
message: '#Access to an undefined property [a-zA-Z0-9\\_]+::\$foo#'
identifier: property.notFound
path: some/dir/SomeFile.php
The reported error has to match both the message pattern and the identifier in order to be ignored.
You can also use only the identifier key to ignore all errors of the same type:
parameters:
ignoreErrors:
-
identifier: property.notFound
Or even multiple identifiers at one:
parameters:
ignoreErrors:
-
identifiers:
- property.notFound
- property.neverWritten
Did you know PHPStan Pro{.phpstan-pro-label} lets you browse ignored errors in a beautiful web UI? It shows the errors right on the line where they'd be reported if they weren't ignored:
<video class="w-full aspect-[1656/1080] mb-8 border border-gray-200 rounded-lg overflow-hidden" autoplay muted loop playsinline poster="/images/phpstan-pro-ignored-errors-poster.jpg"> <source src="/images/phpstan-pro-ignored-errors.mp4" type="video/mp4"> </video>Try out PHPStan Pro{.phpstan-pro-label} by running PHPStan with --pro or by going to account.phpstan.com and creating an account.
Using the fields below, you can generate an entry that you can put in the parameters.ignoreErrors section of your configuration file. It deals with the complexity of writing a matching regular expression from a plain string and encoding that regular expression into the neon format.
{% include 'ignoreErrorsWidget.njk' %}
If you want to ignore all the current errors and only focus on new and changed code from now on, go and learn about the baseline feature.
If some of the ignored errors (both from configuration and PHPDocs) do not occur in the result anymore, PHPStan will let you know and you will have to remove the pattern from the configuration. You can turn off this behaviour by setting reportUnmatchedIgnoredErrors to false in the configuration:
parameters:
reportUnmatchedIgnoredErrors: false
You can turn on/off reporting unused ignores explicitly for each entry in ignoredErrors. This overwrites global reportUnmatchedIgnoredErrors setting.
parameters:
reportUnmatchedIgnoredErrors: false
ignoreErrors:
- '#This message will not be reported as unmatched#'
- '#This message will not be reported as unmatched either#'
-
message: '#But this one will be reported#'
reportUnmatched: true
parameters:
reportUnmatchedIgnoredErrors: true
ignoreErrors:
- '#This message will be reported as unmatched#'
- '#This message will be reported as unmatched too#'
-
message: '#But this one will not be reported#'
reportUnmatched: false
If your codebase contains some files that are broken on purpose (e. g. to test behaviour of your application on files with invalid PHP code), you can exclude them using the excludePaths key. Each entry can either be a file path, a directory path, or a pattern for the fnmatch() function.
If the excludePaths entry is a file path or a directory path, but it does not always exist, you can append the path with (?) to make it optional. Available since PHPStan 1.11.10.
parameters:
excludePaths:
- tests/*/data/*
- src/broken
- node_modules (?) # optional path, might not exist
This is a shortcut for:
parameters:
excludePaths:
analyseAndScan:
- tests/*/data/*
If your project's directory structure mixes your own code (the one you want to analyse and fix bugs in) and third party code (which you're using for discovering symbols, but don't want to analyse), the file structure might look like this:
βββ phpstan.neon
βββ src
βββ foo.php
βββ ...
βββ thirdparty
βββ bar.php
In this case, you want to analyse the whole src directory, but want to exclude src/thirdparty from analysing. This is how to configure PHPStan:
parameters:
paths:
- src
excludePaths:
analyse:
- src/thirdparty
Additionally, there might be a src/broken directory which contains files that you don't want to analyse nor use for discovering symbols. You can modify the configuration to achieve that effect:
parameters:
paths:
- src
excludePaths:
analyse:
- src/thirdparty
analyseAndScan:
- src/broken
For more complex situations, you could create an IgnoreErrorExtension that can ignore errors programmatically based on the Error, Node and Scope.