1bc2bb6386
There is a new option that defaults to Artifact. It should be Executable. Windows can't figure out that the PHP interpreter will run a shell script that then calls PHP (not sure if this even works on Unix) And added a PHP bin dir example for Wins |
||
---|---|---|
.. | ||
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: