コードの修正¶
Psalmは大規模なコードベースの潜在的な問題を見つけるのが得意ですが、一度見つかると、すべての問題を修正するのは途方もない作業になることがあります。
Psalmには、Psalterという名前のツールが付属しており、コードの修正に役立ちます。
以下のように、バイナリを通じて実行できます:
または、Psalmのバイナリを通じて:
安全機能¶
コードの更新には本質的にリスクがあり、自動的に行うとさらにリスクが高くなります。少し安心できるように、いくつかの機能を追加しました:
- Psalterが行う変更を事前に確認するには、
--dry-run
オプションを付けて実行できます。 --php-version
を使用して特定のPHPバージョンを対象にできるので、例えばPHP 7.0のコードにnullable型ヒントを追加したり、PHP 5.6のコードに型ヒントを全く追加しないようにできます。--php-version
はデフォルトで現在のバージョンになります。--safe-types
モードがあり、これはPsalmがdocblock以外のソース(例:型ヒント付きパラメータ、instanceof
チェック、他の戻り値の型ヒントなど)から収集した情報のみを使用してPHP 7の戻り値の型ヒントを更新します。--allow-backwards-incompatible-changes=false
を使用すると、後方互換性のない変更が作成されないようにできます。
プラグイン¶
独自の操作プラグインを渡すことができます。例:
上記の例のプラグインは、コード内の不必要に修飾されたクラス名をすべて、より短い別名バージョンに変換します。
サポートされている修正¶
この初期リリースでは、Psalmが見つける問題の名前に対応する以下の変更をサポートしています。
これらすべてを一度に修正するには、vendor/bin/psalter --issues=all
を実行します。
MissingReturnType¶
vendor/bin/psalter --issues=MissingReturnType --php-version=7.0
を以下のコードで実行すると:
結果:
vendor/bin/psalter --issues=MissingReturnType --php-version=5.6
を以下のコードで実行すると:
結果:
MissingClosureReturnType¶
上記と同様ですが、クロージャに対して適用されます。
InvalidReturnType¶
vendor/bin/psalter --issues=InvalidReturnType
を以下のコードで実行すると:
結果:
戻り値の型ヒントもサポートされているので、vendor/bin/psalter --issues=InvalidReturnType
を以下のコードで実行すると:
結果:
InvalidNullableReturnType¶
vendor/bin/psalter --issues=InvalidNullableReturnType --php-version=7.1
を以下のコードで実行すると:
結果:
vendor/bin/psalter --issues=InvalidNullableReturnType --php-version=7.0
を以下のコードで実行すると:
結果:
InvalidFalsableReturnType¶
vendor/bin/psalter --issues=InvalidFalsableReturnType
を以下のコードで実行すると:
結果:
MissingParamType¶
vendor/bin/psalter --issues=MissingParamType
を以下のコードで実行すると:
結果:
<?php
class C {
/**
* @param string $s
*/
public static function foo($s) : void {
echo $s;
}
}
C::foo("hello");
MissingPropertyType¶
vendor/bin/psalter --issues=MissingPropertyType
を以下のコードで実行すると:
<?php
class A {
public $foo;
public $bar;
public $baz;
public function __construct()
{
if (rand(0, 1)) {
$this->foo = 5;
} else {
$this->foo = "hello";
}
$this->bar = "baz";
}
public function setBaz() {
$this->baz = [1, 2, 3];
}
}
結果:
<?php
class A {
/**
* @var string|int
*/
public $foo;
public string $bar;
/**
* @var array<int, int>|null
* @psalm-var non-empty-list<int>|null
*/
public $baz;
public function __construct()
{
if (rand(0, 1)) {
$this->foo = 5;
} else {
$this->foo = "hello";
}
$this->bar = "baz";
}
public function setBaz() {
$this->baz = [1, 2, 3];
}
}
MismatchingDocblockParamType¶
以下のコードがある場合:
vendor/bin/psalter --issues=MismatchingDocblockParamType
を以下のコードで実行すると:
結果:
MismatchingDocblockReturnType¶
vendor/bin/psalter --issues=MismatchingDocblockReturnType
を以下のコードで実行すると:
結果:
LessSpecificReturnType¶
vendor/bin/psalter --issues=LessSpecificReturnType
を以下のコードで実行すると:
結果:
PossiblyUndefinedVariable¶
vendor/bin/psalter --issues=PossiblyUndefinedVariable
を以下のコードで実行すると:
結果:
PossiblyUndefinedGlobalVariable¶
vendor/bin/psalter --issues=PossiblyUndefinedGlobalVariable
を以下のコードで実行すると:
結果:
UnusedMethod¶
これは使用されていないプライベートメソッドを削除します。
vendor/bin/psalter --issues=UnusedMethod
を以下のコードで実行すると:
結果:
PossiblyUnusedMethod¶
これは使用されていないprotected/publicメソッドを削除します。
vendor/bin/psalter --issues=PossiblyUnusedMethod
を以下のコードで実行すると:
結果:
UnusedProperty¶
これは使用されていないプライベートプロパティを削除します。
vendor/bin/psalter --issues=UnusedProperty
を以下のコードで実行すると:
結果:
PossiblyUnusedProperty¶
これは使用されていないprotected/publicプロパティを削除します。
vendor/bin/psalter --issues=PossiblyUnusedProperty
を以下のコードで実行すると:
結果:
UnusedVariable¶
これは使用されていない変数を削除します。
vendor/bin/psalter --issues=UnusedVariable
を以下のコードで実行すると:
結果:
UnnecessaryVarAnnotation¶
これは使用されていない@var
アノテーションを削除します。
vendor/bin/psalter --issues=UnnecessaryVarAnnotation
を以下のコードで実行すると:
結果:
ParamNameMismatch¶
これは子クラスのパラメータ名を親クラスと一致させます。
vendor/bin/psalter --issues=ParamNameMismatch
を以下のコードで実行すると:
<?php
class A {
public function foo(string $str, bool $b = false) : void {}
}
class AChild extends A {
public function foo(string $string, bool $b = false) : void {
echo $string;
}
}
結果:
<?php
class A {
public function foo(string $str, bool $b = false) : void {}
}
class AChild extends A {
public function foo(string $str, bool $b = false) : void {
echo $str;
}
}