2019-03-20 16:35:55 +01:00
# About Psalm
2019-03-20 03:39:14 +01:00
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**< br />
2020-02-19 05:50:53 +01:00
If Psalm cannot infer a type for an expression then it uses a `mixed` placeholder type. `mixed` types can sometimes mask bugs, so keeping track of them helps you avoid a number of common pitfalls.
2019-03-20 03:39:14 +01:00
2020-02-19 05:50:53 +01:00
- **Intelligent logic checks**< br />
2019-03-20 03:39:14 +01:00
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**< br />
Psalm checks that all properties of a given object have values after the constructor is called.
Psalm also has a few features to make it perform as well as possible on large codebases:
- **Multi-threaded mode**< br />
2020-04-28 15:17:31 +02:00
Wherever possible Psalm will run its analysis in parallel to save time. Useful for large codebases, it has a massive impact on performance.
2019-03-20 03:39:14 +01:00
- **Incremental checks**< br />
2020-10-19 05:28:05 +02:00
By default Psalm only analyses files that have changed and files that reference those changed files.
2019-03-20 03:39:14 +01:00
## Example output
2020-03-21 14:24:41 +01:00
Given a file `implode_strings.php` :
2019-03-20 03:39:14 +01:00
```php
< ?php
$a = ['foo', 'bar'];
echo implode($a, ' ');
```
```bash
2020-03-21 14:24:41 +01:00
> ./vendor/bin/psalm implode_strings.php
ERROR: InvalidArgument - somefile.php:3:14 - Argument 1 of implode expects `string` , `array` provided (see https://psalm.dev/004)
2019-03-20 03:39:14 +01:00
```
## Inspirations
There are two main inspirations for Psalm:
2019-08-17 04:21:17 +02:00
- Etsy's [Phan ](https://github.com/etsy/phan ), which uses nikic's [php-ast ](https://github.com/nikic/php-ast ) extension to create an abstract syntax tree
2019-03-20 03:39:14 +01:00
- Facebook's [Hack ](http://hacklang.org/ ), a PHP-like language that supports many advanced typing features natively, so docblocks aren't necessary.
2019-03-20 16:49:17 +01:00
## Index
- Running Psalm:
2019-06-09 06:54:13 +02:00
- [Installation ](running_psalm/installation.md )
- [Configuration ](running_psalm/configuration.md )
2019-04-14 21:21:41 +02:00
- Plugins
2019-06-09 06:54:13 +02:00
- [Using plugins ](running_psalm/plugins/using_plugins.md )
- [Authoring plugins ](running_psalm/plugins/authoring_plugins.md )
- [How Psalm represents types ](running_psalm/plugins/plugins_type_system.md )
- [Command line usage ](running_psalm/command_line_usage.md )
- [IDE support ](running_psalm/language_server.md )
2019-03-20 16:49:17 +01:00
- Handling errors:
2019-06-09 06:54:13 +02:00
- [Dealing with code issues ](running_psalm/dealing_with_code_issues.md )
- [Issue Types ](running_psalm/issues.md )
- [Checking non-PHP files ](running_psalm/checking_non_php_files.md )
2019-03-20 16:49:17 +01:00
- Annotating code:
2019-06-09 06:54:13 +02:00
- [Typing in Psalm ](annotating_code/typing_in_psalm.md )
- [Supported Annotations ](annotating_code/supported_annotations.md )
- [Template Annotations ](annotating_code/templated_annotations.md )
- Manipulating code:
2019-06-09 07:07:17 +02:00
- [Fixing code ](manipulating_code/fixing.md )
- [Refactoring code ](manipulating_code/refactoring.md )
2019-06-27 23:00:26 +02:00