PHP_CodeSniffer & VSCode 환경을 만들어 보았습니다.

뭔가 코딩 규약을 도입하고 싶은 PHP 프로젝트가 있었기 때문에 PHP_CodeSniffer를 도입해 보았습니다. 그 순서를 정리하고 있습니다.

PHP_CodeSniffer란?



PHP_CodeSniffer는 특정 코딩 규칙을 위반하지 않았는지 확인하고 수정하는 개발 도구입니다.
PHP, JavaScript, CSS 파일의 코딩에 관하여, 규약 위반이 없는지를 판정, 수정할 수 있습니다.

도입 절차



PHP_CodeSniffer 도입



Composer를 사용하여 프로젝트 로컬에 PHP_CodeSniffer 설치
composer require --dev "squizlabs/php_codesniffer=3.*"

코딩 규약의 설정 파일 작성



규칙 설정 파일 .phpcs.xml.dist을 프로젝트에 작성
내용은 예입니다.
<?xml version="1.0"?>
<ruleset name="custom coding standard">
  <description>A custom coding standard.</description>
  <!-- PSR12準拠 -->
  <rule ref="PSR12">
  </rule>

  <!-- インデントはスペース、サイズは4 -->
  <rule ref="Generic.WhiteSpace.ScopeIndent">
    <properties>
      <property name="indent" value="4"/>
      <property name="tabIndent" value="false"/>
    </properties>
  </rule>

  <!-- 変数名をキャメルケースに -->
  <rule ref="Squiz.NamingConventions.ValidVariableName" />
  <rule ref="Squiz.NamingConventions.ValidVariableName.PrivateNoUnderscore">
      <severity>0</severity>
  </rule>

  <!-- vendorフォルダ以下のファイルはチェックしない -->
  <exclude-pattern>vendor/</exclude-pattern>
</ruleset>

동작 확인



코드 확인



체크용으로 스타일이 이상한 HogeClass.php 파일을 준비.
<?php

class hoge_class{
  var some_value;

  function hoge_func(int a,int b){
        $hoge_value = 1;
return 3;
  }
}
phpcs 명령을 사용하여 HogeClass.php를 확인합니다.
./vendor/bin/phpcs HogeClass.php

오류가 발견되면 성공입니다.
---------------------------------------------------------------------------------------------------
FOUND 11 ERRORS AFFECTING 6 LINES
---------------------------------------------------------------------------------------------------
 3 | ERROR | [ ] Each class must be in a namespace of at least one level (a top-level vendor name)
 3 | ERROR | [ ] Class name "hoge_class" is not in PascalCase format
 3 | ERROR | [x] Opening brace of a class must be on the line after the definition
 4 | ERROR | [x] Line indented incorrectly; expected at least 4 spaces, found 2
 6 | ERROR | [x] Line indented incorrectly; expected 4 spaces, found 2
 6 | ERROR | [ ] Method name "hoge_class::hoge_func" is not in camel caps format
 6 | ERROR | [ ] Visibility must be declared on method "hoge_func"
 6 | ERROR | [x] Opening brace should be on a new line
 7 | ERROR | [ ] Variable "hoge_value" is not in valid camel caps format
 8 | ERROR | [x] Line indented incorrectly; expected at least 8 spaces, found 0
 9 | ERROR | [x] Line indented incorrectly; expected 4 spaces, found 2
---------------------------------------------------------------------------------------------------
PHPCBF CAN FIX THE 6 MARKED SNIFF VIOLATIONS AUTOMATICALLY
---------------------------------------------------------------------------------------------------

Time: 309ms; Memory: 6MB

코드 자동 수정



PHP_CodeSniffer에는 phpcbf라는 명령이 있습니다.
이 명령은 도구의 가능한 범위에서 코드를 수정하는 명령입니다.
방금 전 HogeClass.php을 수정해 보겠습니다.
./vendor/bin/phpcbf HogeClass.php
HogeClass를 확인하면 들여 쓰기의 혼란 등에 대해 수정되었습니다.
<?php

class hoge_class
{
    var some_value;

    function hoge_func(int a,int b)
    {
        $hoge_value = 1;
        return 3;
    }
}

단지 phpcs 로 체크하면 규약 위반이 몇개 남아 있으므로, 그들은 수동으로 수정합니다.
-----------------------------------------------------------------------------------------------
FOUND 5 ERRORS AFFECTING 3 LINES
-----------------------------------------------------------------------------------------------
 3 | ERROR | Each class must be in a namespace of at least one level (a top-level vendor name)
 3 | ERROR | Class name "hoge_class" is not in PascalCase format
 7 | ERROR | Method name "hoge_class::hoge_func" is not in camel caps format
 7 | ERROR | Visibility must be declared on method "hoge_func"
 9 | ERROR | Variable "hoge_value" is not in valid camel caps format
-----------------------------------------------------------------------------------------------

Time: 58ms; Memory: 6MB

이것으로 수정 완료입니다.
<?php

namespace hoge;

class HogeClass
{
    private $someValue;

    public function hogeFunc(int $a, int $b)
    {
        $hogeValue = 1;
        return 3;
    }
}

VSCode 플러그인으로 PHP_CodeSniffer와 연동



PHP_CodeSniffer를 사용할 수 있게 되었지만, 커맨드 뿐이라면 쓰기가 나쁜 국면이 있으므로, VSCode와 연계시켜 보겠습니다.

phpcs 플러그인 설치



PHP_CodeSniffer와 연계시키는 플러그인은 많이 있습니다만, 이번은 「phpcs」와 「PHP Sniffer & Beautifier」를 이용합니다.
우선 각각을 install.




VSCode 구성 파일 만들기



프로젝트에 .vscode/setting.json를 만들고 다음을 작성합니다.
자세한 설정은 각 플러그인의 설명을 확인하십시오. 이번에는 적당히 몇 가지 그것 같은 것을 픽업하고 있습니다.

{
    "editor.formatOnSave": true,     <-- ファイルを保存した時に、formatterが動作する
    "phpcs.enable": true,            <-- phpcsを有効にする
    "phpcs.autoConfigSearch": true,  <-- phpcsの設定ファイルを自動で検索する
    "phpsab.fixerEnable": true,      <-- phpsabの自動整形を有効にする
    "phpsab.snifferMode": "onSave",  
    "phpsab.autoConfigSearch": true,
}

에디터로 파일을 확인했을 때, 규약 위반시에는 빨간색 물결선, 저장시에 자동 성형이 되어 있으면 설정 완료입니다.



주의점



PHP CodeSniffer의 동작 확인 중에 알게 된 함정에 대해 정리합니다.

phpcs 명령으로 감지 할 수있는 것은 "규약 위반"이며 SyntaxError는 감지 할 수 없습니다.



phpcs에서 php의 syntaxError를 찾을 수 없습니다. CI라든지 돌려 코드의 품질 체크한다면 phpcs 이외에 php -l 사용해 Syntax 체크하는 것이 좋을지도.
다만 php -l도 정밀도 100%라고 하는 것은 아니기 때문에 과신은 금물.

그럼 좋은 PHP 생활을 ~

좋은 웹페이지 즐겨찾기