1
0
mirror of https://github.com/danog/psalm.git synced 2024-11-27 04:45:20 +01:00
psalm/docs
Philip Hofstetter 395cf587d3 add plugin hook to be called after every function call
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
2020-02-13 09:10:24 -05:00
..
annotating_code Update typing_in_psalm.md 2020-02-07 10:55:44 -05:00
manipulating_code Fix #2173 - remove @var annotations automatically 2019-09-26 15:08:05 -04:00
running_psalm add plugin hook to be called after every function call 2020-02-13 09:10:24 -05:00
how_psalm_works.md Change DependencyFinderVisitor name to ReflectorVisitor and update docs 2018-11-13 14:09:43 -05:00
README.md Remove thing that needn't be code 2019-08-16 22:21:17 -04:00
what_makes_psalm_complicated.md stripping trailing whitespace 2019-02-11 18:39:19 -05:00

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 a mixed placeholder. Any mixed type is a sign of an insufficiently-documented codebase. You can configure Psalm warn when encountering mixed types by adding totallyTyped="true" attribute to your XML config file.

  • Logic checks
    Psalm keeps track of logical assertions made about your code, so if ($a && $a) {} and if ($a && !$a) {} are both treated as issues. Psalm also keeps track of logical assertions made in prior code paths, preventing issues like if ($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