395cf587d3
compared to AfterFunctionCallAnalysisInterface which gets only called after a call to a function declared within the project, a plugin implementing AfterEveryFunctionCallAnalysisInterface will get called for every function call, including calls of PHP builtins. On the other hand, this interface doesn't allow modification of the code nor tweaking the return type, but it's still useful for accounting purposes and for depreacting calls to PHP builtins this fixes #2804 |
||
---|---|---|
.. | ||
annotating_code | ||
manipulating_code | ||
running_psalm | ||
how_psalm_works.md | ||
README.md | ||
what_makes_psalm_complicated.md |
About Psalm
Psalm is a static analysis tool that attempts to dig into your program and find as many type-related bugs as possible.
It has a few features that go further than other similar tools:
-
Mixed type warnings
If Psalm cannot infer a type for an expression then it uses amixed
placeholder. Anymixed
type is a sign of an insufficiently-documented codebase. You can configure Psalm warn when encounteringmixed
types by addingtotallyTyped="true"
attribute to your XML config file. -
Logic checks
Psalm keeps track of logical assertions made about your code, soif ($a && $a) {}
andif ($a && !$a) {}
are both treated as issues. Psalm also keeps track of logical assertions made in prior code paths, preventing issues likeif ($a) {} elseif ($a) {}
. -
Property initialisation checks
Psalm checks that all properties of a given object have values after the constructor is called. -
Support for complicated array shapes
Psalm has support for object-like arrays, allowing you to specify types for all keys of an array if you so wish.
Psalm also has a few features to make it perform as well as possible on large codebases:
-
Multi-threaded mode
Using the--threads=[X]
command line option will run Psalm's analysis stage on [X] threads. Useful for large codebases, it has a massive impact on performance. -
Incremental checks
When using the--diff
command line option, Psalm will only analyse files that have changed and files that reference them.
Example output
// somefile.php
<?php
$a = ['foo', 'bar'];
echo implode($a, ' ');
> ./vendor/bin/psalm somefile.php
ERROR: InvalidArgument - somefile.php:3:14 - Argument 1 of implode expects `string`, `array` provided
Inspirations
There are two main inspirations for Psalm:
- Etsy's Phan, which uses nikic's php-ast extension to create an abstract syntax tree
- Facebook's Hack, a PHP-like language that supports many advanced typing features natively, so docblocks aren't necessary.
Index
- Running Psalm:
- Annotating code:
- Manipulating code: