PHP CodeSnifferで特定のコーディング標準エラーを無視する方法


14

PHP 5のWebアプリケーションがあり、現在、コード標準を強制することで頭痛をあまり引き起こさずにコードの品質が向上するかどうかを判断するために、PHP CodeSnifferを評価しています。良いと思われる場合は、SVN pre-commitフックを追加して、devブランチでコミットされたすべての新しいファイルにコーディング標準の臭いがないようにします。

特定のタイプのエラーを無視するようにPHP codeSnifferを構成する方法はありますか?または、代わりに特定のエラーを警告として扱うようにしますか?

ここに問題を実証する例:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<div>
    <?php
    echo getTabContent('Programming', 1, $numX, $numY);

    if (isset($msg)) {
        echo $msg;
    }
    ?>
</div>
</body>
</html>

そして、これはPHP_CodeSnifferの出力です:

> phpcs test.php 

-------------------------------------------------- ------------------------------
3行に影響する2つのエラーと1つの警告が見つかりました
-------------------------------------------------- ------------------------------
  1 | 警告| 行が85文字を超えています。121文字が含まれています
  9 | エラー| ファイルのドキュメントコメントがありません
 11 | エラー| 行のインデントが正しくありません。0スペースが必要、4が見つかりました
-------------------------------------------------- ------------------------------

行のインデントが正しくありません」エラーの問題があります。PHPのインデントとHTMLのインデントを混ぜているために起こると思います。しかし、これにより読みやすくなりますか?(現時点ではMVCフレームワークに移行するリソースがないことを考慮して)。無視してください。


1
これはIMOにはプログラミングの質問が少なすぎます。これは、ウェブマスターではないハードコアプログラマーにとって最も興味深い「LINT」のようなユーティリティに関するものだからです。しかし、それはきちんと尋ねられ、フォーマットされているので、今のところはそのままにしておきます。
ジェフアトウッド

2
1行目の警告について:HTML5 DOCTYPEの使用を提案できますか?
luiscubal

ご意見ありがとうございます。ジェフ-移動させていただきます。質問を作成したときにPHPタグがなかったことに気付いたはずです:-)。
トム

@luiscubal-彼、良い提案。あなたの思考が好き;
トム

回答:


11

誤ってインデントされた行」エラーを削除するための解決策を見つけましたが、最初にドラゴンマンタンクには優れた点があると言う必要があります-PHPとHTMLを混在させないでください。それは頭痛のレシピです。ただし、残念ながら、特にレガシーソフトウェアでは、PHPとHTMLを混在させることは非常に一般的だと思います。

phpcsデフォルトのコーディング標準(PEAR標準)を使用していると仮定した場合の最も迅速で汚い修正は、関連するSniffファイルを削除することです。Ubuntuを使用して、PEAR標準の場所を見つけてください。

> cd /usr/share/php/PHP/CodeSniffer/Standards/PEAR/Sniffs/WhiteSpace

ScopeIndentSniff.phpファイルの名前を変更して、コードのインデントをチェックするスニフが実行されないようにします。

> sudo mv ScopeIndentSniff.php ScopeIndentSniff.php.bk

ジョブ完了 -インデントはチェックされず、「行のインデントが正しくありません」というエラーは発生しません(コードは標準ではなく、高品質ではありません!)。


上記の解決策はかなりアマチュアです-より明確な解決策は、チェリーピックのカスタマイズを除くすべてのPEAR標準を使用する新しいコーディング標準を作成することです。これは非常に簡単です。getIncludedSniffs()getExcludedSniffs()、いくつかのphpcs命名規則を使用してそれを行う方法は次のとおりです。

Go to the directory where the phpcs coding standards are defined:
> cd /usr/share/php/PHP/CodeSniffer/Standards

Create a new directory for your new standard:
> sudo mkdir PEARish
> cd PEARish

Create your new standard by saving the following in the file:
> sudo emacs PEARishCodingStandard.php
<?php
class PHP_CodeSniffer_Standards_PEARish_PEARishCodingStandard extends PHP_CodeSniffer_Standards_CodingStandard
{
    public function getIncludedSniffs()
    {
      return array('PEAR');
    }

    public function getExcludedSniffs()
    {
      return array('PEAR/Sniffs/WhiteSpace/ScopeIndentSniff.php');
    }
}
?>

フラグをphpcs使用して呼び出して、カスタマイズされた新しいコーディング標準をテストします--standard。例えば:

> phpcs --standard=PEARish Test.php

動作したら、新しい標準をデフォルトとして設定できます。つまり、--standard使用するたびにフラグを入力する必要はありませんphpcs

> sudo phpcs --config-set default_standard PEARish

詳細については、phpcsのマニュアルを参照してください。


これは本当に便利でした-「クラスは少なくとも1レベルの名前空間になければなりません」という行に沿って表示されるエラーと、キャメルケース関数の命名エラーを削除するためにこの回答を使用しました。私はできる限りPSR2を使用していますが、Magentoサイトを編集しているので、すべての機能の名前を変更して名前空間を整理する立場にはありません。
デイブチャイルド

7

HTMLにPHPコードを混ぜてPHPCSを実行すると、多くの問題が発生します。PHPCSは、純粋なPHPスクリプトを解析する場合にのみ本当に役立ちます。組み込みのコーディング標準は、PHP / HTMLの混合ではなく、純粋なPHPを中心に構築されています。

1つのオプションは、独自のカスタム標準を構築し、代わりにそれを使用することです。カスタム標準では、コードの混合を考慮に入れますが、おそらく書くのは面倒です。

フレームワークに移行したくないと言ったので、他のオプションはテンプレートシステムを使用することです。SmartyTwigは、どちらもMVCフレームワークの外部で使用できます。それらのいずれかに移動し、PHPCSでテンプレートファイルではなく.PHPファイルのみを解析します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.