Phpstan 정적 분석

13328 단어 devopsphptesting
테스트 코드는 고품질 코드 라이브러리를 확보하는 방법입니다. 이것은 프로젝트의 유지보수성을 확보하는 방법이자 제품에 손상되지 않는 기능을 확보하는 방법입니다.Travis CI과 같은 CI 도구는 원본 코드 관리로 전송될 때마다 코드를 테스트하는 데 도움을 줄 수 있습니다.
정적 분석은 실제 실행 코드가 아닌 상황에서 코드의 기본 논리, 운행 시 또는 인쇄 이상을 테스트하는 방법이다.
당신이 반드시 짐작한 바와 같이, 코드 라이브러리의 정적 분석은 매우 빨리 발생한다. 왜냐하면 코드는 실제로 실행되지 않고 흔히 볼 수 있는 오류를 스캔하기 때문이다. 예를 들어 예상한 날짜 유형을 되돌려 주지 않는 방법이 있기 때문이다.

정적 분석의 작업 원리


말 그대로 정적 분석은 코드의 오류를 포획하기 전에 코드를 실행할 필요가 없다.Dart나 Java와 같은 정적 유형 언어는 컴파일러에 이미 이 기능을 내장하고 있다.그것들은 항상 구조의 types을 정의하기 때문에 방법이나 변수에 맞춤법 오류가 발생하거나 형식이 정확하지 않으면 컴파일러가 실행되지 않습니다.정적 분석과 PHPStan 등 도구가 등장하기 전에 개발자는 PHP 코드를 디버깅하여 오류를 찾는 데 많은 시간을 들였다. 왜냐하면 PHP의 실행은 한 줄씩 실행되기 때문에 오류가 포함된 줄에 도달했을 때만 오류를 던질 수 있기 때문이다.오류 유형에 따라 오류가 발생한 후에도 계속 실행될 수 있습니다.
PHPStan은 instanceof, try-catch 블록, typehints의 사용, 함수에 전달되는 매개 변수 수량, 호출 방법과 변수의 접근성, and many more 등 일부 언어 구조를 검사한다.

PHPStan: 가장 좋아하는 언어로 정적 분석


최근 PHPStan의 작성자는 PHPStan Pro을 발표했는데 이것은 연속 보기 모드에서 이미 매우 전망이 있어 보인다 (PHP에서 열을 다시 불러올까?).웹 UI 하나와 대화형 수정 프로그램!좋은 소식은 오류를 더 빨리 발견함으로써 많은 시간과 키를 절약할 수 있다는 것이다. PHPStan은 당신에게 복구 방안을 건의할 수 있고 모든 사람들이 더욱 기뻐할 것이다.

프로젝트에서 PHPStan 사용


프로젝트에서 PHPStan을 사용하는 단계를 설명합니다.

환경 설정


선택한 모든 PHP 항목에서 PHPStan을 사용할 수 있습니다. 이 강좌의 목적으로 제가 사용할 프레임워크 PHP 라이브러리를 만들었습니다.제 composer.json 파일은 phpstan을 설치하기 전에 이렇습니다.

내 작곡가 캡처.json 설정
개발자 종속성으로 PHPStan 설치
composer require --dev phpstan/phpstan
composer와의 개발 의존항으로 phpstan을 설치하고 있습니다.
이제 1차 분석을 실행하여 다음 코드를 복사하여 터미널에 붙여넣을 준비가 되었습니다.
phpstan analyse src
src 디렉터리의 내용에 따라 이 명령을 실행한 후에 오류가 발생할 수 있습니다. 이것은 전혀 문제가 없습니다. 왜냐하면 우리는 곧 자신의 취향에 따라 PHPStan을 설정하는 방법을 알게 될 것입니다.

phpstan 명령

analyse 키워드는 phpstan 분석 코드 라이브러리를 알려주고 명령의 세 번째 파라미터는 분석할 코드의 경로입니다.여기 src을 사용했습니다. 제가 쓴 코드가 여기 있기 때문에 공급업체 폴더나 다른 임시 폴더를 분석할 필요가 없습니다.그러나 테스트를 작성하고 있다면 tests 디렉터리도 분석하는 것이 좋습니다.PHPStan에는 PHPUNit, Behat, mocky 등 mock 프레임워크와 같은 유행하는 테스트 라이브러리가 있습니다.

확장 프로비저닝


PHPStan은 파일 형식으로 구성되어 있으며, 프로젝트 폴더의 루트 디렉터리에는 neon이 있습니다.phpstan.neon 명령을 실행할 때마다 루트 디렉터리에서 phpstan analyse을 찾아 분석 코드의 설정으로 사용합니다.프로젝트의 루트 디렉터리에서 프로필을 찾을 수 없으면 PHPStan은 phpstan.neon을 검사하고 존재하지 않으면 기본 프로필로 실행합니다.다음은 기본 구성 옵션입니다.더 많은 phpstan.neon.dist 을 읽으세요.
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';
    }
}
위의 코드 라이브러리가 비교적 새롭고 엄격한 유형의 PHP 7.4를 사용하기 때문에 몇 분 안에 운 좋게 이 오류를 해결할 수 있습니다.큰 코드 라이브러리가 있을 때, 상황이 그렇지 않을 수도 있습니다. 코드를 쓸 때 정적 분석을 고려하지 않았기 때문에 괴로워할 필요가 없습니다.
우리의 phpstan.neon 파일을 편집하고 level을 0에서 8 사이의 어느 위치로 설정하면 우리가 만족하는 수준에 따라 느슨하거나 엄격한 분석을 할 수 있습니다.max 레벨은 PHPStan 버전에 따라 가장 엄격한 가용 값을 사용합니다.here 수준에 대한 자세한 내용

여기 있다 오류로 말살:)


벌레가 커지고 문제가 생기기 전에 잡아라.내가 이렇게 하는 것을 좋아하는 방법은 composer.json의 스크립트 부분에 phpstan을 추가하고 원본 코드 관리로 보내기 전에 명령을 실행하여 나의 코드 라이브러리를 분석하는 것이다.travisci 구축에 phpstan을 추가할 수 있습니다. 잠시 후에 이 점을 어떻게 하는지 알아보겠습니다.
다음 내용을 작곡가의 스크립트 부분에 추가합니다.json:
"scripts": {
        "analyse": [
            "phpstan analyse src -c phpstan.neon --level max --no-progress",
            "phpstan analyse tests -c phpstan.neon --level 4 --no-progress"
        ],
}
이것은composer에 analyse이라는 스크립트를 추가합니다. composer run analyse을 실행하면 이 스크립트를 실행할 수 있습니다.여기에서 지정한 두 가지 명령을 실행합니다.
"phpstan analyse src -c phpstan.neon --level 5 --no-progress"
"phpstan analyse tests -c phpstan.neon --level 5 --no-progress"
첫 번째 명령은 src 디렉터리를 분석하고, 두 번째 명령은 tests 디렉터리를 분석한다.우리는 몇 가지 논점을 전달하고 있다. 너는 그들이 무엇을 하고 있는지 거의 알 수 있다.
  • -c phpstan.neon: phpstan에서 정의한 설정을 사용하여 실행하라고 알려 줍니다.네온사인
  • - 레벨: phpstan이 어떤 레벨에서 실행되는지 알려주기 분석 (이 예는 5)
  • -noprogress는 phpstan이 우리의 코드 라이브러리를 훑어볼 때 분석 진도를 보고하지 말라고 알려주는 특수한 표지이다.
  • travis 구조에 phpstan 추가


    이것은 .travis.yml의 스크립트 부분에 composer 스크립트를 추가하여 우리의 코드 라이브러리를 분석함으로써 실현할 수 있다.
    script:
      - composer run analyse
    
    이것은 프레젠테이션 목적으로만 사용되며, 이상적인 경우, 다른 검사를 실행해야 합니다. 이 검사들을composer의composer 스크립트에 그룹화할 수 있습니다.json 파일,travis 구축에서 이 스크립트를 실행하지만, 이를 어떻게 실현하는지 요약하기 위해서입니다.
    당신은 내가 이곳에서 을 구축하는 데 사용한 예시 .travis.yaml과 예시 작곡가를 찾을 수 있습니다.json 파일 here

    여기 있다 최종 주석


    정적 분석은 내가 최근에 배운 것이다. 나는 그것이 독특한 개발자 체험을 제공했다고 말해야 한다.효율적이고 깨끗한 코드를 작성하고 오류가 원본 코드 관리에 들어가기 전에 오류를 포착할 수 있기 때문이다.나는 본고가 당신에게 정적 분석이 어떻게 당신이 더 좋은 코드를 작성하고 개발 과정을 개선하는 데 도움을 줄 수 있는지 깊이 있게 이해할 수 있기를 바랍니다.당신의 생각과 평론을 남겨 주세요.

    좋은 웹페이지 즐겨찾기