46
36

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

PHP_CodeSnifferのルールまとめ

Last updated at Posted at 2020-08-11

2023/05時点でPHP_CodeSnifferの最新バージョンは3.7ですが、こちらはバージョン3.5についての記事です。

当時は気が付かなかったのですが、ルールの詳細は次のようなコマンドで出力することできます。最新の情報はこれやテストを見るのが良いと思います。

phpcs --standard=PSR12 --generator=Text

ただし、ざっと見ただけでも一部に欠落が見られるので完全ではありません。 PSR-12, PSR-2
コマンドのオプションについてはWikiをご確認ください。

概要

PHP_CodeSnifferにはどのようなルールがあるのか調べてまとめています。
バージョン^3.5を対象としています。

PHP_CodeSnifferとは

squizlabs/PHP_CodeSniffer

PHP_CodeSnifferはコーディング標準の違反検出するスクリプトと、それを自動で修正するスクリプトです。

PHP_CodeSniffer is a set of two PHP scripts; the main phpcs script that tokenizes PHP, JavaScript and CSS files to detect violations of a defined coding standard, and a second phpcbf script to automatically correct coding standard violations. PHP_CodeSniffer is an essential development tool that ensures your code remains clean and consistent.

デフォルトのコーディング標準

デフォルトで次のコーディング標準がインストールされています。

$ phpcs -i
The installed coding standards are MySource, PEAR, PSR1, PSR12, PSR2, Squiz and Zend

この中からPSR2、PSR12にどのようなルールが含まれるかリストアップします。

$ phpcs --standard=PSR12 -e

ルール一覧

※ MySource、Zendは対象(PSR2、PSR12)に含まれていないので省略します。

PSR2 PSR12
Generic Arrays ArrayIndent
DisallowLongArraySyntax
DisallowShortArraySyntax
Classes DuplicateClassName
OpeningBraceSameLine
CodeAnalysis AssignmentInCondition
EmptyPHPStatement
EmptyStatement
ForLoopShouldBeWhileLoop
ForLoopWithTestFunctionCall
JumbledIncrementer
UnconditionalIfStatement
UnnecessaryFinalModifier
UnusedFunctionParameter
UselessOverridingMethod
Commenting DocComment
Fixme
Todo
ControlStructures DisallowYodaConditions
InlineControlStructure
Debug CSSLint
ClosureLinter
ESLint
JSHint
Files ByteOrderMark
EndFileNewline
EndFileNoNewline
ExecutableFile
InlineHTML
LineEndings
LineLength
LowercasedFilename
OneClassPerFile
OneInterfacePerFile
OneObjectStructurePerFile
OneTraitPerFile
Formatting DisallowMultipleStatements
MultipleStatementAlignment
NoSpaceAfterCast
SpaceAfterCast
SpaceAfterNot
SpaceBeforeCast
Functions CallTimePassByReference
FunctionCallArgumentSpacing
OpeningFunctionBraceBsdAllman
OpeningFunctionBraceKernighanRitchie
Metrics CyclomaticComplexity
NestingLevel
NamingConventions CamelCapsFunctionName
ConstructorName
UpperCaseConstantName
PHP BacktickOperator
CharacterBeforePHPOpeningTag
ClosingPHPTag
DeprecatedFunctions
DisallowAlternativePHPTags
DisallowRequestSuperglobal
DisallowShortOpenTag
DiscourageGoto
ForbiddenFunctions
LowerCaseConstant
LowerCaseKeyword
LowerCaseType
NoSilencedErrors
RequireStrictTypes
SAPIUsage
Syntax
UpperCaseConstant
Strings UnnecessaryStringConcat
VersionControl GitMergeConflict
SubversionProperties
WhiteSpace ArbitraryParenthesesSpacing
DisallowSpaceIndent
DisallowTabIndent
IncrementDecrementSpacing
LanguageConstructSpacing
ScopeIndent
SpreadOperatorSpacingAfter
PEAR Classes ClassDeclaration
Commenting ClassComment
FileComment
FunctionComment
InlineComment
ControlStructures ControlSignature
MultiLineCondition
Files IncludingFile
Formatting MultiLineAssignment
Functions FunctionCallSignature
FunctionDeclaration
ValidDefaultValue
NamingConventions ValidClassName
ValidFunctionName
ValidVariableName
WhiteSpace ObjectOperatorIndent
ScopeClosingBrace
ScopeIndent
PSR1 Classes ClassDeclaration
Files SideEffects
Methods CamelCapsMethodName
PSR2 Classes ClassDeclaration
PropertyDeclaration
ControlStructures ControlStructureSpacing
ElseIfDeclaration
SwitchDeclaration
Files ClosingTag
EndFileNewline
Methods FunctionCallSignature
FunctionClosingBrace
MethodDeclaration
Namespaces NamespaceDeclaration
UseDeclaration
PSR12 Classes AnonClassDeclaration
ClassInstantiation
ClosingBrace
ControlStructures BooleanOperatorPlacement
ControlStructureSpacing
Files DeclareStatement
FileHeader
ImportStatement
OpenTag
Functions NullableTypeDeclaration
ReturnTypeDeclaration
Keywords ShortFormTypeKeywords
Namespaces CompoundNamespaceDepth
Operators OperatorSpacing
Properties ConstantVisibility
Traits UseDeclaration
Squiz Arrays ArrayBracketSpacing
ArrayDeclaration
CSS ClassDefinitionClosingBraceSpace
ClassDefinitionNameSpacing
ClassDefinitionOpeningBraceSpace
ColonSpacing
ColourDefinition
DisallowMultipleStyleDefinitions
DuplicateClassDefinition
DuplicateStyleDefinition
EmptyClassDefinition
EmptyStyleDefinition
ForbiddenStyles
Indentation
LowercaseStyleDefinition
MissingColon
NamedColours
Opacity
SemicolonSpacing
ShorthandSize
Classes ClassDeclaration
ClassFileName
DuplicateProperty
LowercaseClassKeywords
SelfMemberReference
ValidClassName
Commenting BlockComment
ClassComment
ClosingDeclarationComment
DocCommentAlignment
EmptyCatchComment
FileComment
FunctionComment
FunctionCommentThrowTag
InlineComment
LongConditionClosingComment
PostStatementComment
VariableComment
ControlStructures ControlSignature
ElseIfDeclaration
ForEachLoopDeclaration
ForLoopDeclaration
InlineIfDeclaration
LowercaseDeclaration
SwitchDeclaration
Debug JSLint
JavaScriptLint
Files FileExtension
Formatting OperatorBracket
Functions FunctionDeclarationArgumentSpacing
FunctionDeclaration
FunctionDuplicateArgument
GlobalFunction
LowercaseFunctionKeywords
MultiLineFunctionDeclaration
NamingConventions
NamingConventions ValidFunctionName
ValidVariableName
Objects DisallowObjectStringIndex
ObjectInstantiation
ObjectMemberComma
Operators ComparisonOperatorUsage
IncrementDecrementUsage
ValidLogicalOperators
PHP CommentedOutCode
DisallowBooleanStatement
DisallowComparisonAssignment
DisallowInlineIf
DisallowMultipleAssignments
DisallowSizeFunctionsInLoops
DiscouragedFunctions
EmbeddedPhp
Eval
GlobalKeyword
Heredoc
InnerFunctions
LowercasePHPFunctions
NonExecutableCode
Scope MemberVarScope
MethodScope
StaticThisUsage
Strings ConcatenationSpacing
DoubleQuoteUsage
EchoedStrings
WhiteSpace CastSpacing
ControlStructureSpacing
FunctionClosingBraceSpace
FunctionOpeningBraceSpace
FunctionSpacing
LanguageConstructSpacing
LogicalOperatorSpacing
MemberVarSpacing
ObjectOperatorSpacing
OperatorSpacing
PropertyLabelSpacing
ScopeClosingBrace
ScopeKeywordSpacing
SemicolonSpacing
SuperfluousWhitespace

ルール詳細

それぞれのルールがどのようなチェックを行うのか、簡単な例と共にまとめます。

Generic

Generic.Arrays.ArrayIndent

配列の要素をスペース4つでインデントされているかチェックします。
インデントの数はカスタマイズ可能です。

$array = [
    'ok',
  'ng', // Array key not indented correctly; expected 4 spaces but found 2
];

Generic.Arrays.DisallowLongArraySyntax

長い配列構文を禁止します。

$ok = [];
$ng = array(); // Short array syntax must be used to define arrays

Generic.Arrays.DisallowShortArraySyntax

短い配列構文を禁止します。
DisallowLongArraySyntaxの逆です。

$ok = array();
$ng = []; // Short array syntax is not allowed

Generic.Classes.DuplicateClassName

同じクラスまたはインターフェース名が複数のファイルで使用されている場合、エラーとなります。

Generic.Classes.OpeningBraceSameLine

クラス/インターフェース/トレイトの開き括弧がクラス宣言と同じ行にあることを確認します。

class OK {}

class NG
{ // Opening brace should be on the same line as the declaration for class NG
}

Generic.CodeAnalysis.AssignmentInCondition

条件内で行われている変数の割り当てを検出します。
ただし三項演算では検出されません。

if ($ng = true) { // Variable assignment found within a condition. Did you mean to do a comparison ?
}

// Note: this sniff does not detect variable assignments in the conditional part of ternaries!
$note = true ? 'a' : 'b';

Generic.CodeAnalysis.EmptyPHPStatement

空のPHPステートメントに対してチェックします。

  • 間に実行可能コードがない2つのセミコロン
  • 空のPHP open-closeタグの組み合わせ
<?php
; // Empty PHP statement detected: superfluous semi-colon.
?>

<?php ?> // Empty PHP open/close tag combination detected.

Generic.CodeAnalysis.EmptyStatement

空のステートメントを検出します。(try, catch, finally, do, else, elseif, for, foreach, if, switch, while)
完全に空であるか、空文字またはコメントだけの場合も空とみなされます。

if (true) { // Empty IF statement detected
    // empty
}

おそらく特定のステートメントを除外することも可能です。

<rule ref="Generic.CodeAnalysis.EmptyStatement">
    <!-- But allow empty catch -->
    <exclude name="Generic.CodeAnalysis.EmptyStatement.DetectedCatch"/>
</rule>

Generic.CodeAnalysis.ForLoopShouldBeWhileLoop

whileループに簡略化できるforループを検出します。

for (; true; ) { // This FOR loop can be simplified to a WHILE loop
    break;
}

Generic.CodeAnalysis.ForLoopWithTestFunctionCall

テスト式で関数呼び出しを使用するforループを検出します。

$a = [1, 2, 3, 4];

for ($i = 0; $i < count($a); $i++) { // Avoid function calls in a FOR loop test part
    $a[$i] *= $i;
}

Generic.CodeAnalysis.JumbledIncrementer

forループでジャンピングするインクリメンターを検出します。

for ($i = 0; $i < 10; $i++) { // Loop incrementor ($i) jumbling with inner loop
    for ($k = 0; $k < 20; $i++) {
        echo 'Hello';
    }
}

Generic.CodeAnalysis.UnconditionalIfStatement

無条件のifおよびelseifステートメントを検出します。
trueかfalseのみ設定されている条件が検出されます。

if (true) { // Avoid IF statements that are always true or false
    echo 'Hello';
}

Generic.CodeAnalysis.UnnecessaryFinalModifier

finalクラス内の不要なfinal修飾子を検出します。

final class Sample
{
    public final function hoge() // Unnecessary FINAL modifier in FINAL class
    {
    }
}

Generic.CodeAnalysis.UnusedFunctionParameter

未使用の関数パラメーターを検出します。
ただし関数の中身が空、またはコメントのみの場合は検出されません。

function hoge($hoge) { // The method parameter $hoge is never used
    echo 'Hello';
}

function fuga($fuga) {
}

Generic.CodeAnalysis.UselessOverridingMethod

単に親を呼び出す、不要なオーバーライドされたメソッドを検出します。

class Hoge
{
    public function __construct()
    {
        echo 'Hello';
    }
}

class Fuga extends Hoge
{
    public function __construct() // Possible useless method overriding detected
    {
        parent::__construct();
    }
}

Generic.Commenting.DocComment

docブロックが基本的なフォーマットに従っていることを確認します。

/** */

/** example
 */

Generic.Commenting.Fixme

FIXMEコメントについて警告します。

// fixme: hoge

Generic.Commenting.Todo

TODOコメントについて警告します。

// todo: hoge

Generic.ControlStructures.DisallowYodaConditions

ヨーダ条件式の使用を禁止します。

$value = 10;

if (100 === $value) { // Usage of Yoda conditions is not allowed; switch the expression order
}

Generic.ControlStructures.InlineControlStructure

インライン制御ステートメントが存在しないことを確認します。
カスタマイズによりエラーではなく警告にすることが可能です。

$value = 100;

if ($value === 100) echo 'Hello'; // Inline control structures are not allowed

Generic.Files.ByteOrderMark

BOM定義を検出します。

Generic.Files.EndFileNewline

ファイルが改行文字で終了することを確認します。

Generic.Files.EndFileNoNewline

ファイルが改行文字で終わっていないことを確認します。
EndFileNewlineの逆です。

Generic.Files.ExecutableFile

ファイルが実行可能でないことをテストします。
fileperms()でパーミッションがチェックされます。

Generic.Files.InlineHTML

ファイル全体がPHPのみであり、空白やインラインHTMLがないことを確認します。

Generic.Files.LineEndings

行末文字(改行コード)が正しいことを確認します。
行末文字はカスタマイズ可能です。

Generic.Files.LineLength

ファイル内のすべての行の長さをチェックします。
長さが80文字を超えると警告、100文字を超えるとエラーになります。
文字数はカスタマイズ可能です。

Generic.Files.LowercasedFilename

すべてのファイル名が小文字であることを確認します。

Generic.Files.OneClassPerFile

ファイルごとに1つのクラスのみが宣言されていることを確認します。

class Hoge {}
class Fuga {} // Only one class is allowed in a file

Generic.Files.OneInterfacePerFile

ファイルごとに1つのインターフェースのみが宣言されていることを確認します。

interface HogeInterface {}
interface FugaInterface {} // Only one interface is allowed in a file

Generic.Files.OneObjectStructurePerFile

ファイルごとに1つのオブジェクト構造のみが宣言されていることを確認します。
次の3つのルールが1つになったイメージです。

  • Generic.Files.OneClassPerFile
  • Generic.Files.OneInterfacePerFile
  • Generic.Files.OneTraitPerFile

Generic.Files.OneTraitPerFile

ファイルごとに1つのトレイトのみが宣言されていることを確認します。

trait HogeTrait {}
trait FugaTrait {} // Only one trait is allowed in a file

Generic.Formatting.DisallowMultipleStatements

各ステートメントが単独で1行にあることを確認します。

$a = 'hoge'; $b = 'fuga'; // Each PHP statement must be on a line by itself

Generic.Formatting.MultipleStatementAlignment

代入演算子の配置をチェックします。複数の隣接する割り当てがある場合は、各割り当ての等号が揃っていることを確認します。
パディングの最大量はカスタマイズ可能です。

$a   = 'a';
$bb  = 'bb';
$ccc = 'ccc';
$d = 'd'; // Equals sign not aligned with surrounding assignments; expected 3 spaces but found 1 space

Generic.Formatting.NoSpaceAfterCast

キャストトークンの後にスペースがないことを確認します。

$hoge = (int)'123';
$fuga = (int) '123'; // A cast statement must not be followed by a space

Generic.Formatting.SpaceAfterCast

キャストトークンの後にスペースが1つあることを確認します。NoSpaceAfterCastの逆です。
スペースの数などをカスタマイズ可能です。

$hoge = (int) '123';
$fuga = (int)'123'; // Expected 1 space(s) after cast statement; 0 found

Generic.Formatting.SpaceAfterNot

!演算子の後の間隔をチェックします。デフォルトでは演算子の後にスペースが1つあることを確認します。
スペースの数などをカスタマイズ可能です。

$hoge = ! true;
$fuga = !true; // Expected 1 space(s) after NOT operator; 0 found

Generic.Formatting.SpaceBeforeCast

キャストトークンの前にスペースが1つあることを確認します。

$hoge = (int) '123';
$fuga =(int) '123'; // A cast statement must be preceded by a single space

Generic.Functions.CallTimePassByReference

関数を呼び出すときに変数が参照渡しされないようにします。

$hoge = 'hoge';
var_dump(&$hoge); // Call-time pass-by-reference calls are prohibited

Generic.Functions.FunctionCallArgumentSpacing

メソッドと関数の呼び出しの間隔が正しいことを確認します。

sprintf('%s','hoge'); // No space found after comma in argument list
sprintf('%s' , 'hoge'); // Space found before comma in argument list
sprintf('%s',  'hoge'); // Expected 1 space after comma in argument list; 2 found

Generic.Functions.OpeningFunctionBraceBsdAllman

関数の左中括弧が関数宣言の後の行にあることを確認します。

function hoge () { // Opening brace should be on a new line
    echo 'hoge';
}

Generic.Functions.OpeningFunctionBraceKernighanRitchie

関数の左中括弧が関数宣言と同じ行にあることを確認します。
OpeningFunctionBraceBsdAllmanの逆です。

function hoge ()
{ // Opening brace should be on the same line as the declaration
    echo 'hoge';
}

Generic.Metrics.CyclomaticComplexity

関数の循環的複雑度(McCabe)をチェックします。
10より大きいと警告、20より大きいとエラーが検出されます。この閾値はカスタマイズ可能です。

Generic.Metrics.NestingLevel

メソッドのネストレベルをチェックします。
5より大きいと警告、10より大きいとエラーが検出されます。この閾値はカスタマイズ可能です。

Generic.NamingConventions.CamelCapsFunctionName

メソッドと関数の名前がキャメルケースであることを確認します。

function HogeFuga() // Function name "HogeFuga" is not in camel caps format
{
    echo 'hoge fuga';
}

Generic.NamingConventions.ConstructorName

PHP4スタイルのコンストラクターを禁止します。

class Hoge
{
    public function Hoge() // PHP4 style constructors are not allowed; use "__construct()" instead
    {
    }
}

Generic.NamingConventions.UpperCaseConstantName

定数名がすべて大文字であることを確認します。

const hoge = 'hoge'; // Class constants must be uppercase; expected HOGE but found hoge

Generic.PHP.BacktickOperator

バッククォート実行演算子の使用を禁止します。

$output = `ls -al`; // Use of the backtick operator is forbidden
echo "<pre>$output</pre>";

Generic.PHP.CharacterBeforePHPOpeningTag

PHPの開始タグがファイルの最初のコンテンツであることを確認します。

Generic.PHP.ClosingPHPTag

開いているPHPタグが終了タグとペアになっていることを確認します。

Generic.PHP.DeprecatedFunctions

非推奨のPHP関数の使用を推奨しません。

mbsplit('\s', 'hello world'); // Function mbsplit() has been deprecated

Generic.PHP.DisallowAlternativePHPTags

代替PHPタグ<% %>が使用されていないことを確認します。

Generic.PHP.DisallowRequestSuperglobal

$_REQUESTスーパーグローバルが使用されていないことを確認します。

var_dump($_REQUEST); // The $_REQUEST superglobal should not be used; use $_GET, $_POST, or $_COOKIE instead

Generic.PHP.DisallowShortOpenTag

省略形のPHPオープンタグ<?が使用されていないことを確認します。

Generic.PHP.DiscourageGoto

PHPのgoto言語構造の使用を推奨しません。

Generic.PHP.ForbiddenFunctions

エイリアス関数 sizeof() delete() の使用を推奨しません。
使用を禁止する関数はカスタマイズ可能です。

sizeof(['a', 'b']); // The use of function sizeof() is forbidden; use count() instead

Generic.PHP.LowerCaseConstant

true、false、nullのすべての使用が小文字であることを確認します。

is_null(NULL); // TRUE, FALSE and NULL must be lowercase; expected "null" but found "NULL"

Generic.PHP.LowerCaseKeyword

すべてのPHPキーワードが小文字であることを確認します。

ECHO 'hoge'; // PHP keywords must be lowercase; expected "echo" but found "ECHO"

Generic.PHP.LowerCaseType

すべてのPHPタイプが小文字であることを確認します。

$var = (INT) '123'; // PHP type casts must be lowercase; expected "(int)" but found "(INT)"

Generic.PHP.NoSilencedErrors

接頭辞が@のコードが検出された場合、エラーまたは警告をスローします。
エラーか警告かカスタマイズ可能です。

@fopen('hoge.txt', 'r'); // Silencing errors is discouraged; found: @fopen('hoge.txt'...

Generic.PHP.RequireStrictTypes

strict_typesが宣言されていることを確認します。

Generic.PHP.SAPIUsage

php_sapi_name()の代わりにPHP_SAPI定数が使用されるようにします。

Generic.PHP.Syntax

PHPが構文がクリーンであると確信できるようにします。
php -lコマンドでチェックされます。

Generic.PHP.UpperCaseConstant

TRUE、FALSE、およびNULLのすべての使用が大文字であることを確認します。
LowerCaseConstantの逆です。

is_null(null); // TRUE, FALSE and NULL must be uppercase; expected "NULL" but found "null"

Generic.Strings.UnnecessaryStringConcat

2つの文字列が連結されていないことを確認します。
オプションにより複数行に分割されたケースは許可することができます。

$str = 'Hoge' . 'Fuga'; // String concat is not required here; use a single string instead

Generic.VersionControl.GitMergeConflict

Gitのマージ競合アーティファクトをチェックします。

<<<<<<< HEAD
$hoge = 'hoge';
=======
$fuga = 'fuga';
>>>>>>> develop

Generic.VersionControl.SubversionProperties

正しいSubversionプロパティが設定されていることをテストします。

Generic.WhiteSpace.ArbitraryParenthesesSpacing

任意の括弧の内側の空白をチェックして修正します。
(関数の呼び出し、配列、制御構造を除く)
スペースの数などはカスタマイズ可能です。

$hoge = 'hoge';
$fuga = ($hoge !== 'fuga' ); // Expected 0 space before close parenthesis; 1 found

Generic.WhiteSpace.DisallowSpaceIndent

スペースが精密インデント以外のインデントに使用されている場合、エラーがスローされます。

Generic.WhiteSpace.DisallowTabIndent

インデントにタブが使用されている場合、エラーをスローします。

Generic.WhiteSpace.IncrementDecrementSpacing

変数とインクリメント/デクリメント演算子の間の間隔を確認します。

$i = 0;
$i ++; // Expected no spaces between $i and the increment operator; 1 found

Generic.WhiteSpace.LanguageConstructSpacing

すべての言語構造とそのコンテンツの間に単一のスペースが含まれるようにします。

echo'hoge'; // Language constructs must be followed by a single space; expected "echo 'hoge'" but found "echo'hoge'"

Generic.WhiteSpace.ScopeIndent

制御構造が正しく定義およびインデントされていることを確認します。
インデントのサイズなどカスタマイズ可能です。

for ($i = 0; $i < 3; $i++) {
    echo 'hoge';
  echo $i; // Line indented incorrectly; expected at least 4 spaces, found 2
}

Generic.WhiteSpace.SpreadOperatorSpacingAfter

スプレッド演算子とそれが適用される変数/関数呼び出しの間の間隔を確認します。
スペースの数などはカスタマイズ可能です。

function hoge(... $args) // Expected 0 space(s) after the spread operator; 1 found
{
    echo $args;
}

PEAR

PEAR.Commenting.InlineComment

Perl型(Unix シェル型)のコメントが使用されていないことを確認します。

// OK
# NG

PEAR.Functions.ValidDefaultValue

デフォルト値を持つ関数パラメーターが宣言の最後にあることを確認します。

function hoge ($a = null, $b) // Arguments with default values must be at the end of the argument list
{
    echo $a;
    echo $b;
}

PSR1

PSR1.Classes.ClassDeclaration

クラスの宣言が正しいことを確認します。

  • 各クラスは単独でファイル内になければなりません
  • 各クラスは少なくとも1つのレベルのネームスペースにある必要があります(トップレベルのベンダー名)

PSR1.Files.SideEffects

ファイルが新しいシンボルを宣言し、他の副作用を引き起こさないこと、または副作用のあるロジックを実行することを保証しますが、両方は行いません。
副作用については下記を参照してください。
Side Effects - PSR-1: Basic Coding Standard - PHP-FIG

PSR1.Methods.CamelCapsMethodName

メソッド名がキャメルケースを使用して定義されていることを確認します。

function hoge_fuga() // Function name "hoge_fuga" is not in camel caps format
{
    echo 'Hoge Fuga';
}

PSR2

PSR2.Classes.ClassDeclaration

クラスの宣言をチェックし、その継承が正しいことを確認します。
Extends and Implements - PSR2
オプションでカスタマイズ可能です。

class Hoge { // Opening brace of a class must be on the line after the definition
}

PSR2.Classes.PropertyDeclaration

プロパティが正しく宣言されていることを確認します。
Properties - PSR2

class Fuga
{
    var $fuga; // The var keyword must not be used to declare a property
    private $_fuga; // Property name "$_fuga" should not be prefixed with an underscore to indicate visibility
    protected $aaa, $bbb; // There must not be more than one property declared per statement
}

PSR2.ControlStructures.ControlStructureSpacing

括弧で囲まれたステートメント内の制御構造に正しいパディングがあることを確認します。
デフォルトは前後のスペースがゼロであることを確認しますが、
スペースの数はカスタマイズ可能です。

if ( $condition === true) { // Expected 0 spaces after opening bracket; 1 found
}

PSR2.ControlStructures.ElseIfDeclaration

else ifステートメントがないことを確認します(elseifを代わりに使用する必要があります)。
if, elseif, else - PSR2

if ($condition === 1) {
} else if ($condition === 2) { // Usage of ELSE IF is discouraged; use ELSEIF instead
}

PSR2.ControlStructures.SwitchDeclaration

すべてのswitchステートメントが正しく定義されていることを確認します。
switch, case - PSR2

switch ($expr) {
    case  0: // CASE keyword must be followed by a single space
        echo 'First case';
        break;
    default:
        echo 'Default case';
        break;
}

PSR2.Files.ClosingTag

ファイルが終了タグ?>で終わっていないことを確認します。

PSR2.Files.EndFileNewline

ファイルが改行文字で終了することを確認します。

PSR2.Methods.FunctionCallSignature

関数呼び出し形式が正しいことを確認します。
引数のインデント、スペースの数、改行についてカスタマイズ可能です。

sprintf( '%s %s', 'hoge', 'fuga'); // Space after opening parenthesis of function call prohibited

PSR2.Methods.FunctionClosingBrace

関数の右中括弧が本体の直後にあることを確認します。

function hoge()
{
    echo 'hoge';

} // Function closing brace must go on the next line following the body; found 1 blank lines before brace

PSR2.Methods.MethodDeclaration

メソッド宣言が正しいことを確認します。

abstract class MethodDeclaration
{
    abstract public function hoge();
    public abstract function fuga(); // The abstract declaration must precede the visibility declaration
}

PSR2.Namespaces.NamespaceDeclaration

名前空間が正しく宣言されていることを確認します。

namespace App;
echo 'hoge'; // There must be one blank line after the namespace declaration

PSR2.Namespaces.UseDeclaration

USEブロックが正しく宣言されていることを確認します。

use A, B; // There must be one USE keyword per declaration

PSR12

PSR12.Classes.AnonClassDeclaration

匿名クラスの宣言が正しいことを確認します。
Anonymous Classes - PSR12
インデントの数はカスタマイズ可能です。

$instance = new class implements
  \ArrayAccess, // Expected 4 spaces before interface name; 2 found
    \Countable { // Opening brace must be on the line after the last implemented interface
};

PSR12.Classes.ClassInstantiation

クラスが括弧を使用してインスタンス化されていることを確認します。

new \DateTime; // Parentheses must be used when instantiating a new class
new \DateTime();

PSR12.Classes.ClosingBrace

閉じ中かっこが行の最後のコンテンツであることを確認します。

class Hoge
{
    const HOGE = 'hoge';
} $hoge = new Hoge(); // Closing brace must not be followed by any comment or statement on the same line

PSR12.ControlStructures.BooleanOperatorPlacement

制御構造のブール演算子が正しい場所にあることを確認します。
条件間のブール演算子は、行の先頭または末尾にある必要があります。また、行の先頭か末尾のどちらかに統一する必要があります。
カスタマイズにより先頭か末尾か明示的に設定することができます。

if ( // Boolean operators between conditions must be at the beginning or end of the line, but not both
    $a > 0 &&
    $a <= 10
    || $b == 1
) {
}

PSR12.ControlStructures.ControlStructureSpacing

制御構造の間隔が正しいことを確認します。

インデントの数はカスタマイズ可能です。

if ($a > 0 && // The first expression of a multi-line controlstructure must be on the line after the opening parenthesis
    $a <= 10
) {
}

PSR12.Files.DeclareStatement

declareステートメントの形式をチェックします。

declare( strict_types=1); // Expected no space between opening parenthesis and directive in a declare statement

PSR12.Files.FileHeader

ファイルヘッダーの形式を確認します。

<?php
namespace App; // Header blocks must be separated by a single blank line

PSR12.Files.ImportStatement

importステートメントが正しく定義されていることを確認します。

use \Hoge; // Import statements must not begin with a leading backslash

PSR12.Files.OpenTag

開始タグが正しく定義されていることを確認します。

<?php namespace App; // Opening PHP tag must be on a line by itself

PSR12.Functions.NullableTypeDeclaration

null可能な型ヒントに余分な空白がないことを確認します。

function hoge(? int $num) // There must not be a space between the question mark and the type in nullable type declarations
{
    var_dump($num);
}

PSR12.Functions.ReturnTypeDeclaration

関数とクロージャーに対して戻り型が正しく定義されていることを確認してください。

  • 戻り値の型宣言では、コロンと型の間にスペースが1つ必要です
  • 戻り値の型宣言では、コロンの前にスペースがあってはなりません
function hoge(int $num):int // There must be a single space between the colon and type in a return type declaration
{
    return $num + 1;
}

PSR12.Keywords.ShortFormTypeKeywords

型キーワードの短い形式が使用されていることを確認します。

  • (integer) -> (int)
  • (boolean) -> (bool)
$int = (integer) '123'; // Short form type keywords must be used. Found: (integer)
$bool = (boolean) 1; // Short form type keywords must be used. Found: (boolean)

PSR12.Namespaces.CompoundNamespaceDepth

複合名前空間が深く定義されていないことを確認します。
デフォルトでは深さが2を超えるとエラーになりますが、深さはカスタマイズ可能です。

use Vendor\Package\SomeNamespace\{
    SubnamespaceOne\AnotherNamespace\ClassA, // Compound namespaces cannot have a depth more than 2
    SubnamespaceOne\ClassB,
    ClassZ,
};

PSR12.Operators.OperatorSpacing

演算子の周囲に有効な間隔があることを確認します。
オプションによりカスタマイズ可能です。

$num = 2;

if ($num=== 1) { // Expected at least 1 space before "==="; 0 found
}

PSR12.Properties.ConstantVisibility

すべてのクラス定数に可視性が設定されていることを確認します。

class Hoge
{
    const HOGE = 'hoge'; // Visibility must be declared on all constants if your project supports PHP 7.1 or later
}

PSR12.Traits.UseDeclaration

Traitインポート文が正しく定義されていることを確認します。

class Hoge
{
    public const HOGE = 'hoge';
    use FugaTrait; // The first trait import statement must be declared on the first non-comment line after the class opening brace
}

Squiz

Squiz.Arrays.ArrayBracketSpacing

角括弧の周囲にスペースがないことを確認してください。

$array ['hoge']; // Space found before square bracket; expected "$array[" but found "$array ["
$array[ 'huga']; // Space found after square bracket; expected "['huga'" but found "[ 'huga'"

Squiz.Arrays.ArrayDeclaration

配列が配列コーディング標準に準拠していることを確認します。
スペースやカンマなど様々な項目をチェックします。

Array(); // Array keyword should be lower case; expected "array" but found "Array"
array (); // There must be no space between the "array" keyword and the opening parenthesis
array(1,); // Comma not allowed after last value in single-line array declaration

Squiz.Classes.ClassDeclaration

クラスの宣言をチェックし、その継承が正しいことを確認します。
カスタマイズ オプション

 class A // error SpaceBeforeKeyword
 {
}

class B // error MultipleClasses
{
}

Squiz.Classes.ClassFileName

ファイル名とファイル内に含まれるクラスの名前が一致することをテストします。

Fuga.php
class Hoge // NoMatch
{
}

Squiz.Classes.DuplicateProperty

[Javascript] JSクラスに重複するプロパティ名が含まれていないことを確認します。

Squiz.Classes.LowercaseClassKeywords

すべてのクラスキーワードが小文字であることを確認します。

CLASS Hoge// FoundUppercase
{
}

Squiz.Classes.SelfMemberReference

selfメンバー参照をテストします。

class Hoge
{
    public static $hoge = 'hoge';

    public static function hoge()
    {
        SELF::$hoge; // IncorrectCase
        self ::$hoge; // SpaceBefore
        self:: $hoge; // SpaceAfter
    }
}

Squiz.Classes.ValidClassName

クラスがキャメルキャップであることを確認し、最初の文字を大文字にします。

class valid_class_name // NotCamelCaps
{
}

Squiz.Commenting.BlockComment

ブロックコメントが適切に使用されていることを確認します。

/* SingleLine */

/* NoNewLine
 */

Squiz.Commenting.ClassComment

クラスのドキュメントコメントを解析して検証します。

/*
 * WrongStyle
 */
class ClassComment
{
}

Squiz.Commenting.ClosingDeclarationComment

クラス、インターフェース、関数に関する// end ...コメントをチェックします。

Expected //end class
class Hoge
{
}

Squiz.Commenting.DocCommentAlignment

ドキュメントコメントのアスタリスクが正しく整列していることをテストします。

/**
 *NoSpaceAfterStar
   * SpaceBeforeStar
 */
class Hoge
{
}

Squiz.Commenting.EmptyCatchComment

コメントなしの空のcatch句をチェックします。

Missing
try {
    throw new \Exception();
} catch (\Exception $e) {
}

Squiz.Commenting.FileComment

ファイルのドキュメントコメントを解析して検証します。
コメントのフォーマットやタグ(@package, @subpackage, @author, @copyright)の検証など。

Squiz.Commenting.FunctionComment

関数のドキュメントコメントを解析および検証します。
タグ@return @param @throwsの検証など。
PEAR.commenting.FunctionCommentを継承しています。

Squiz.Commenting.FunctionCommentThrowTag

関数がスローする例外タイプごとに@throwsタグが存在することを確認します。

Squiz.Commenting.InlineComment

コメント間に適切な間隔があることを確認します。
また、次の点を確認します。

  • ブロックコメントの使用
  • Perl型の使用
  • 空のコメント
  • コメントのフォーマット(大文字から開始、ピリオド等で終了)

Squiz.Commenting.LongConditionClosingComment

長い条件の最後にコメントがあることを確認します。
終了コメントが必要になる行数、終了コメントのフォーマットはカスタマイズ可能です。

終了コメントの例
if (true) {
}//end if

Squiz.Commenting.PostStatementComment

ステートメントの後にコメントがないことを確認するためにチェックします。

if (true) { // Found
}

Squiz.Commenting.VariableComment

変数ドキュメントコメントを解析および検証します。
主に@var @seeタグについて検証します。

Content missing for @var tag in member variable comment
class VariableComment
{
    /**
     * @var
     */
    private $emptyVar;
}

Squiz.Functions.GlobalFunction

グローバルな関数について警告を表示し、staticクラスへ入れることを提案します。

Squiz.NamingConventions.ValidFunctionName

メソッド名が正しいことを確認します。
PEAR.NamingConventions.ValidFunctionNameを継承し、スコープ外のメソッドに関する確認が次の点に変更されます。

  • マジックメソッド以外のダブルアンダースコアを許可しない
  • メソッド名はキャメルキャップ形式とする
function __hoge() // DoubleUnderscore
{
}

function Fuga() // NotCamelCaps
{
}
class Hoge
{
    public function __hoge() // MethodDoubleUnderscore
    {
    }

    public function Fuga() // ScopeNotCamelCaps
    {
    }
}

Squiz.NamingConventions.ValidVariableName

変数とメンバー変数の名前を確認します。

$Hoge = 'hoge'; // NotCamelCaps
$fuga = "$Hoge fuga"; // StringNotCamelCaps

class Hoge
{
    public $_hoge; // PublicHasUnderscore
    private $fuga; // PrivateNoUnderscore
    private $_hoge_fuga; // MemberNotCamelCaps
}

Squiz.Operators.ValidLogicalOperators

論理演算子「and」および「or」が使用されていないことを確認します。
&& または || を使用してください。

if (true and false) { // NotAllowed
}

if (true or false) { // NotAllowed
}

Squiz.PHP.GlobalKeyword

「global」キーワードの使用を停止します。

Squiz.PHP.InnerFunctions

関数内の関数が使用されないようにします。

function hoge()
{
    function fuga() // NotAllowed
    {
    }
}

Squiz.PHP.LowercasePHPFunctions

組み込みのPHP関数へのすべての呼び出しが小文字であることを確認します。

use function VAR_DUMP; // UseStatementUppercase
VAR_DUMP('hoge'); // CallUppercase

Squiz.PHP.NonExecutableCode

実行できないコードについて警告します。

function hoge()
{
    return; // ReturnNotRequired
}

while (true) {
    break;
    echo 'hoge'; // Unreachable
}

Squiz.Scope.MemberVarScope

クラスメンバーにスコープ修飾子があることを確認します。

class Hoge
{
    var $hoge; // Missing
}

Squiz.Scope.MethodScope

クラスメソッドにスコープ修飾子があることを確認します。

class Hoge
{
    function hoge() // Missing
    {
    }
}

Squiz.Scope.StaticThisUsage

静的メソッドでの$thisの使用をチェックします。これにより、ランタイムエラーが発生します。

Squiz.Strings.ConcatenationSpacing

連結演算子の周囲のスペースについて確認します。
デフォルトでは、連結演算子の前後にスペースがないことを保証します。
スペースの数はカスタマイズ可能です。

Squiz.Strings.DoubleQuoteUsage

二重引用符の文字列の使用が保証されていることを確認します。

$hoge = "$var"; // ContainsVar
$fuga = "fuga"; // NotRequired

Squiz.Strings.EchoedStrings

echoの文字列を中括弧で囲むことを禁止する。

echo('hoge'); // HasBracket

Squiz.WhiteSpace.CastSpacing

キャストステートメントに空白が含まれていないことを確認してください。

$hoge = ( int ) '1'; // ContainsWhiteSpace

Squiz.WhiteSpace.FunctionOpeningBraceSpace

関数の開始中括弧の後に空行がないことを確認します。

Squiz.WhiteSpace.FunctionSpacing

関数同士の間隔と、その前後の制御構造との間隔をチェックします。
デフォルトの間隔は2行ですが、それぞれカスタマイズ可能です。

class FunctionSpacing
{

    public function hoge() // BeforeFirst
    {
    } // After

    public function fuga()
    {
    } // AfterLast

}

Squiz.WhiteSpace.LanguageConstructSpacing

すべての言語構造に、それらとそのコンテンツの間に単一のスペースが含まれていることを確認します。

echo'hoge'; // Incorrect
new  \DateTime(); // IncorrectSingle

Squiz.WhiteSpace.ObjectOperatorSpacing

オブジェクト演算子の前後に空白がないことを確認してください。
オプションにより改行した時の検証がカスタマイズ可能です。

$object-> hoge(); // After
$object?-> hoge(); // After
$object ::fuga(); // Before

Squiz.WhiteSpace.SemicolonSpacing

セミコロンの前に空白がないことを確認してください。

Squiz.WhiteSpace.SuperfluousWhitespace

不要な空白をチェックします。

  • 行末の空白 (EndLine)
  • ファイル先頭の追加の空白 (StartFile)
  • ファイル末尾の追加の空白 (EndFile)
  • 関数の複数の空白行 (EmptyLines)

オプションによりカスタマイズ可能です。

訂正等

PHP_CodeSnifferのバージョン

3.0 → ^3.5

ルール一覧

  • PSR12.Keywords.ShortFormTypeKeywordsを追加(記載漏れ)
46
36
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
46
36

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?