mirror of
https://github.com/danog/psalm.git
synced 2024-11-27 04:45:20 +01:00
257 lines
4.1 KiB
Markdown
257 lines
4.1 KiB
Markdown
# Using Psalter
|
|
|
|
Psalm is good at finding potential issues in large codebases, but once found, it can be something of a gargantuan task to fix all the issues.
|
|
|
|
## Safety features
|
|
|
|
Updating code is inherently risky, doing so automatically is even more so. I've added a few features to make it a little more reassuring:
|
|
|
|
- To see what changes Psalter will make ahead of time, you can run it with `--dry-run`.
|
|
- You can target particular versions of PHP via `--php-version`, so that (for example) you don't add nullable typehints to PHP 7.0 code, or any typehints at all to PHP 5.6 code. `--php-version` defaults to your current version.
|
|
- it has a `--safe-types` mode that will only update PHP 7 return typehints with information Psalm has gathered from non-docblock sources of type information (e.g. typehinted params, `instanceof` checks, other return typehints etc.)
|
|
|
|
|
|
## Plugins
|
|
|
|
You can pass in your own manipulation plugins e.g.
|
|
```bash
|
|
vendor/bin/psalter --plugin=vendor/vimeo/psalm/examples/ClassUnqualifier.php --dry-run
|
|
```
|
|
|
|
The above example plugin converts all unnecessarily qualified classnames in your code to shorter aliased versions.
|
|
|
|
## Supported fixes
|
|
|
|
This initial release provides support for the following alterations, corresponding to the names of issues Psalm finds:
|
|
|
|
### MissingReturnType
|
|
|
|
Running `vendor/bin/psalter --issues=MissingReturnType --php-version=7.0` on
|
|
|
|
```php
|
|
function foo() {
|
|
return "hello";
|
|
}
|
|
```
|
|
|
|
gives
|
|
|
|
```php
|
|
function foo() : string {
|
|
return "hello";
|
|
}
|
|
```
|
|
|
|
and running `vendor/bin/psalter --issues=MissingReturnType --php-version=5.6` on
|
|
|
|
```php
|
|
function foo() {
|
|
return "hello";
|
|
}
|
|
```
|
|
|
|
gives
|
|
|
|
```php
|
|
/**
|
|
* @return string
|
|
*/
|
|
function foo() {
|
|
return "hello";
|
|
}
|
|
```
|
|
|
|
### MissingClosureReturnType
|
|
|
|
As above, except for closures
|
|
|
|
### InvalidReturnType
|
|
|
|
Running `vendor/bin/psalter --issues=InvalidReturnType` on
|
|
|
|
```php
|
|
/**
|
|
* @return int
|
|
*/
|
|
function foo() {
|
|
return "hello";
|
|
}
|
|
```
|
|
|
|
gives
|
|
|
|
```php
|
|
/**
|
|
* @return string
|
|
*/
|
|
function foo() {
|
|
return "hello";
|
|
}
|
|
```
|
|
|
|
There's also support for return typehints, so running `vendor/bin/psalter --issues=InvalidReturnType` on
|
|
|
|
```php
|
|
function foo() : int {
|
|
return "hello";
|
|
}
|
|
```
|
|
|
|
gives
|
|
|
|
```php
|
|
function foo() : string {
|
|
return "hello";
|
|
}
|
|
```
|
|
|
|
### InvalidNullableReturnType
|
|
|
|
Running `vendor/bin/psalter --issues=InvalidNullableReturnType --php-version=7.1` on
|
|
|
|
```php
|
|
function foo() : string {
|
|
return rand(0, 1) ? "hello" : null;
|
|
}
|
|
```
|
|
|
|
gives
|
|
|
|
```php
|
|
function foo() : ?string {
|
|
return rand(0, 1) ? "hello" : null;
|
|
}
|
|
```
|
|
|
|
and running `vendor/bin/psalter --issues=InvalidNullableReturnType --php-version=7.0` on
|
|
|
|
```php
|
|
function foo() : string {
|
|
return rand(0, 1) ? "hello" : null;
|
|
}
|
|
```
|
|
|
|
gives
|
|
|
|
```php
|
|
/**
|
|
* @return string|null
|
|
*/
|
|
function foo() {
|
|
return rand(0, 1) ? "hello" : null;
|
|
}
|
|
```
|
|
|
|
### InvalidFalsableReturnType
|
|
|
|
Running `vendor/bin/psalter --issues=InvalidFalsableReturnType` on
|
|
|
|
```php
|
|
function foo() : string {
|
|
return rand(0, 1) ? "hello" : false;
|
|
}
|
|
```
|
|
|
|
gives
|
|
|
|
```php
|
|
/**
|
|
* @return string|false
|
|
*/
|
|
function foo() {
|
|
return rand(0, 1) ? "hello" : false;
|
|
}
|
|
```
|
|
|
|
### MismatchingDocblockParamType
|
|
|
|
Given
|
|
|
|
```php
|
|
class A {}
|
|
class B extends A {}
|
|
class C extends A {}
|
|
class D {}
|
|
```
|
|
|
|
running `vendor/bin/psalter --issues=MismatchingDocblockParamType` on
|
|
```php
|
|
/**
|
|
* @param B|C $first
|
|
* @param D $second
|
|
*/
|
|
function foo(A $first, A $second) : void {}
|
|
```
|
|
|
|
gives
|
|
|
|
```php
|
|
/**
|
|
* @param B|C $first
|
|
* @param A $second
|
|
*/
|
|
function foo(A $first, A $second) : void {}
|
|
```
|
|
|
|
### MismatchingDocblockReturnType
|
|
|
|
Running `vendor/bin/psalter --issues=MismatchingDocblockReturnType` on
|
|
```php
|
|
/**
|
|
* @return int
|
|
*/
|
|
function foo() : string {
|
|
return "hello";
|
|
}
|
|
```
|
|
|
|
gives
|
|
|
|
```php
|
|
/**
|
|
* @return string
|
|
*/
|
|
function foo() : string {
|
|
return "hello";
|
|
}
|
|
```
|
|
|
|
### LessSpecificReturnType
|
|
|
|
Running `vendor/bin/psalter --issues=LessSpecificReturnType` on
|
|
|
|
```php
|
|
function foo() : ?string {
|
|
return "hello";
|
|
}
|
|
```
|
|
|
|
gives
|
|
|
|
```php
|
|
function foo() : string {
|
|
return "hello";
|
|
}
|
|
```
|
|
|
|
### PossiblyUndefinedVariable
|
|
|
|
Running `vendor/bin/psalter --issues=PossiblyUndefinedVariable` on
|
|
|
|
```php
|
|
if (rand(0, 1)) {
|
|
$a = 5;
|
|
}
|
|
echo $a;
|
|
```
|
|
|
|
gives
|
|
|
|
```php
|
|
$a = null;
|
|
if (rand(0, 1)) {
|
|
$a = 5;
|
|
}
|
|
echo $a;
|
|
```
|