phpstanによる静的解析


あなたのコードをテストする方法は、あなたのプロジェクトの保守性を保証する1つの方法であり、また、製品の壊れた機能を出荷しないようにする方法です.CIツールTravis CI あなたがソースコントロールにプッシュするたびにコードをテストするのに役立ちます.
静的解析は、コードを実際に実行することなく、基本的な論理、ランタイムまたは類型例外のコードをテストするメソッドです.
あなたが推測したように、コードベースが実際に実行されないが、期待される日付型を返さないメソッドを持つような一般的なエラーでスキャンされているので、コードベースの静的解析が高速に発生します.

静的解析


名前が意味する静的解析は、実際にバグをキャッチする前にコードを実行する必要はありません.DARTやJavaのような静的に型付けされた言語は、すでにこの機能をコンパイラに組み込まれています.彼らは常に定義types コンストラクタの中では、メソッドや変数に対してtypoや不正な型がある場合にはコンパイラは動作しません.phpstanのような静的な解析とツールの出現の前に、PHPの実行が行単位であるため、PHPのコードをデバッグするのに多くの時間を費やします.エラーが発生した後に実行を継続することがあります.
phpstanを使用するなどの言語構成のカップルをチェックしますinstanceof , try-catch ブロックtypehints , 関数に渡される引数の数、呼び出されたメソッドと変数のアクセシビリティand many more .

phpstan:お気に入りの言語で静的解析


最近ではPHPStan Pro phpstanのクリエイターによって発表されました、そして、それはすでに連続した腕時計モード(PHPで熱い再ローディング)で非常に有望です.Web UIとインタラクティブなフィクサー!良いニュースはすぐにエラーを見つけることによって時間とキーストロークのトンを保存するとphpstanあなたとあなたのために修正を提案することができます誰もが幸せです.

プロジェクトでのphpstanの使用


以下では、我々のプロジェクトでphpstanを使用する手順を実行します.

環境設定


phpstanを選択したPHPプロジェクトで使用することができます.このチュートリアルでは、私が使用するスケルトンPHPライブラリを作成しました.マイcomposer.json インストール前のファイルphpstan
私の作曲家のスクリーンショット.JSONセットアップ
phpstanをdev依存関係にインストールする
composer require --dev phpstan/phpstan
インストール中ですphpstan 作曲家とのdev依存関係として.
今すぐあなたの最初の解析を実行する準備ができて、コピーして、下記のコードをあなたの端末に貼り付けます.
phpstan analyse src
あなたのコンテンツに応じてsrc ディレクトリは、このコマンドを実行した後にいくつかのエラーを得る可能性がありますので、我々はすぐに我々の好みにPHPSTANを設定する方法を見て、それは全く素晴らしいです.

phpstanコマンド


The analyse キーワードは何かphpstan コードベースを解析するには、コマンド内の3番目の引数を解析するコードへのパスです.ここで使ったsrc 私が書いたコードがどこにあるのかというと、私のベンダーフォルダや他のテンポラリフォルダを分析する必要はありません.しかし、あなたがテストを書いているならば、それはあなたのtests ディレクトリも.phpstanにはextensions PhpUnit、Behatおよびmockのような模擬フレームワークのような人気のテストライブラリのために.

構成


phpstanは、 neon その設定のためのファイル形式phpstan.neon プロジェクトフォルダのルートで.あなたが走るときはいつでもphpstan analyse コマンドを探すphpstan.neon ルートで、コードを解析するための設定として使用します.プロジェクトのルートで設定ファイルが見つからない場合は、phpstanもphpstan.neon.dist としても存在しない場合は、デフォルトの設定を実行します.以下は、基本的な設定オプションを開始するためです.続きを読むhere .
parameters:
    level: max
    paths:
        - src
            - test
上記の設定を使用すると、現在実行中のphpstan コマンドpath ソースコードに.これはあなたが一度有効なコマンドですphpstan.neon ルートディレクトリに
phpstan analyse
level maxに設定すると、より厳密な解析や不正なタイプヒント、不正な戻り値の型などのエラーが発生します.
$ phpstan analyse
Note: Using configuration file Code\demo\photo-library\phpstan.neon.
 1/1 [============================] 100%

 ------ ----------------------------------------------------------------------------------------
  Line   Photo.php
 ------ ----------------------------------------------------------------------------------------
  7      Property Photo::$http has no typehint specified.
  9      Method Photo::__construct() has parameter $token with no typehint specified.
  25     Method Photo::photos() return type has no value type specified in iterable type array.
         💡 Consider adding something like array<Foo> to the PHPDoc.
         You can turn off this check by setting checkMissingIterableValueType: false in your
         Code\demo\photo-library\phpstan.neon.
  27     Method Photo::photos() should return array but returns string.
 ------ ----------------------------------------------------------------------------------------
この行に注意してください.

Note: Using configuration file Code\demo\photo-library\phpstan.neon.


上記のエラーを生成したコードは次のようになります.
<?php

declare(strict_types=1);

use GuzzleHttp\Client;

class Photo{

    private $http;

    public function __construct(string $token)
    {
        $this->http = new GuzzleHttp\Client([
            'base_uri' => 'https://photo.google.com',
            'headers' => [
                'Authorization' => 'Bearer ' . $token
            ]
        ]);
    }

    /**
     * Returns an array of photos in the 
     * library
     * 
     * @return array
     */
    public function photos(): array
    {
        return 'Photos in the library';
    }
}
上記のCodeBaseは比較的新しいので、PHP 7.4を使用して厳密な型を有効にしているので、数分後にこれらのエラーを解決することができます.これは、大きなコードベースを持っている場合ではないかもしれません.また、静的解析を行わずにコードを書いているので、これらのエラーが発生した場合には、気分が悪くなりません.
編集phpstan.neon ファイルと設定level 0と8の間にどこかに私たちが解決するレベルに基づいて緩やかなまたは厳密な分析を行うことができます.The max レベルは、あなたが持っているphpstanのバージョンによって利用できる最も厳しい値を使用します.レベルについて詳しく知るhere

それをバグにしてください


彼らが大きくなる前にバグをキャッチし、問題を引き起こす.私がこれをする1つの方法は、phpstanをスクリプトセクションに加えることですcomposer.json コマンドを実行して、ソースコントロールにプッシュする前にCodeBaseを解析します.また、追加することができますphpstan トラヴィスCIがビルドされ、我々はどのように少しそれを行うには表示されます.
あなたの作曲家のスクリプトセクションに以下を加えてください.JSON :
"scripts": {
        "analyse": [
            "phpstan analyse src -c phpstan.neon --level max --no-progress",
            "phpstan analyse tests -c phpstan.neon --level 4 --no-progress"
        ],
}
これはスクリプトと呼ばれるanalyse 実行して実行できる作曲家にcomposer run analyse . ここで指定した2つのコマンドを実行します.
"phpstan analyse src -c phpstan.neon --level 5 --no-progress"
"phpstan analyse tests -c phpstan.neon --level 5 --no-progress"
第一コマンド解析src ディレクトリと第2の分析tests ディレクトリ.私たちはいくつかの引数を渡しています.
  • -phpstan.ネオン:phpstanにphpstanで定義された設定で実行するように指示します.ネオン
  • —レベル: phpstanにどのようなレベルでこの解析を実行しますか
  • —それが我々のコードベースを横切って、分析進展を報告していないPHSTSTAに言う進歩は、特別な旗です.
  • あなたのトラビスビルドにphpstanを追加する


    これは、スクリプトスクリプトのスクリプトのセクションで我々のコードベースを分析するために作曲家スクリプトを加えることによって達成されることができます.travis.yml :
    script:
      - composer run analyse
    
    これはデモンストレーション目的のためだけにあります.理想的には、他のチェックを実行して、作曲家の作曲家スクリプトにグループ化できます.JSONファイルを実行し、そのスクリプトを実行します.
    あなたはサンプルを見つけることができます.travis.yaml ここで私はビルドのために使用here とサンプルの作曲家.JSONファイルhere

    最終ノート


    静的解析は最近学んだことで、ユニークなデベロッパー体験をしなければならない.効率的でクリーンなコードを書くことができ、ソースコントロールにする前にエラーをキャッチできます.私は、この記事が静的解析がどのようにより良いコードを書いて、あなたの開発プロセスを改善するのを助けることができるかについての洞察をあなたに与えたことを望みます.あなたの考えとコメントを残してください.