PHP_CodeSnifferのルールまとめ

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

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

`phpcs --standard=PSR12 --generator=Text`

ただし、ざっと見ただけでも一部に欠落が見られるので完全ではありません。 [PSR-12](https://github.com/squizlabs/PHP_CodeSniffer/pull/2870), [PSR-2](https://github.com/squizlabs/PHP_CodeSniffer/pull/3832)
コマンドのオプションについては[Wiki](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Usage)をご確認ください。
:::

# 概要

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

# PHP_CodeSnifferとは

[squizlabs/PHP_CodeSniffer](https://github.com/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.

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

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

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

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

```sh
$ phpcs --standard=PSR12 -e
```

# ルール一覧

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

|   |  |  | PSR2 | PSR12 |
|:---|:---|:---|:---:|:---:|
| Generic | Arrays | [ArrayIndent](#genericarraysarrayindent) |  |  |
|   |  | [DisallowLongArraySyntax](#genericarraysdisallowlongarraysyntax) |  |  |
|   |  | [DisallowShortArraySyntax](#genericarraysdisallowshortarraysyntax) |  |  |
|   | Classes | [DuplicateClassName](#genericclassesduplicateclassname) |  |  |
|   |  | [OpeningBraceSameLine](#genericclassesopeningbracesameline) |  |  |
|   | CodeAnalysis | [AssignmentInCondition](#genericcodeanalysisassignmentincondition) |  |  |
|   |  | [EmptyPHPStatement](#genericcodeanalysisemptyphpstatement) |  |  |
|   |  | [EmptyStatement](#genericcodeanalysisemptystatement) |  |  |
|   |  | [ForLoopShouldBeWhileLoop](#genericcodeanalysisforloopshouldbewhileloop) |  |  |
|   |  | [ForLoopWithTestFunctionCall](#genericcodeanalysisforloopwithtestfunctioncall) |  |  |
|   |  | [JumbledIncrementer](#genericcodeanalysisjumbledincrementer) |  |  |
|   |  | [UnconditionalIfStatement](#genericcodeanalysisunconditionalifstatement) |  |  |
|   |  | [UnnecessaryFinalModifier](#genericcodeanalysisunnecessaryfinalmodifier) |  |  |
|   |  | [UnusedFunctionParameter](#genericcodeanalysisunusedfunctionparameter) |  |  |
|   |  | [UselessOverridingMethod](#genericcodeanalysisuselessoverridingmethod) |  |  |
|   | Commenting | [DocComment](#genericcommentingdoccomment) |  |  |
|   |  | [Fixme](#genericcommentingfixme) |  |  |
|   |  | [Todo](#genericcommentingtodo) |  |  |
|   | ControlStructures | [DisallowYodaConditions](#genericcontrolstructuresdisallowyodaconditions) |  |  |
|   |  | [InlineControlStructure](#genericcontrolstructuresinlinecontrolstructure) | ○ | ○ |
|   | Debug | CSSLint |  |  |
|   |  | ClosureLinter |  |  |
|   |  | ESLint |  |  |
|   |  | JSHint |  |  |
|   | Files | [ByteOrderMark](#genericfilesendfilenewline) | ○ | ○ |
|   |  | [EndFileNewline](#genericfilesendfilenewline) |  |  |
|   |  | [EndFileNoNewline](#genericfilesendfilenonewline) |  |  |
|   |  | [ExecutableFile](#genericfilesexecutablefile) |  |  |
|   |  | [InlineHTML](#genericfilesinlinehtml) |  |  |
|   |  | [LineEndings](#genericfileslineendings) | ○ | ○ |
|   |  | [LineLength](#genericfileslinelength) | ○ | ○ |
|   |  | [LowercasedFilename](#genericfileslowercasedfilename) |  |  |
|   |  | [OneClassPerFile](#genericfilesoneclassperfile) |  |  |
|   |  | [OneInterfacePerFile](#genericfiles-oneinterfaceperfile) |  |  |
|   |  | [OneObjectStructurePerFile](#genericfilesoneobjectstructureperfile) |  |  |
|   |  | [OneTraitPerFile](#genericfilesonetraitperfile) |  |  |
|   | Formatting | [DisallowMultipleStatements](#genericformattingdisallowmultiplestatements) | ○ | ○ |
|   |  | [MultipleStatementAlignment](#genericformattingmultiplestatementalignment) |  |  |
|   |  | [NoSpaceAfterCast](#genericformattingnospaceaftercast) |  |  |
|   |  | [SpaceAfterCast](#genericformattingspaceaftercast) |  |  |
|   |  | [SpaceAfterNot](#genericformattingspaceafternot) |  |  |
|   |  | [SpaceBeforeCast](#genericformattingspacebeforecast) |  |  |
|   | Functions | [CallTimePassByReference](#genericfunctionscalltimepassbyreference) |  |  |
|   |  | [FunctionCallArgumentSpacing](#genericfunctionsfunctioncallargumentspacing) | ○ | ○ |
|   |  | [OpeningFunctionBraceBsdAllman](#genericfunctionsopeningfunctionbracebsdallman) |  |  |
|   |  | [OpeningFunctionBraceKernighanRitchie](#genericfunctionsopeningfunctionbracekernighanritchie) |  |  |
|   | Metrics | [CyclomaticComplexity](#genericmetricscyclomaticcomplexity) |  |  |
|   |  | [NestingLevel](#genericmetricsnestinglevel) |  |  |
|   | NamingConventions | [CamelCapsFunctionName](#genericnamingconventionscamelcapsfunctionname) |  |  |
|   |  | [ConstructorName](#genericnamingconventionsconstructorname) |  |  |
|   |  | [UpperCaseConstantName](#genericnamingconventionsuppercaseconstantname) | ○ | ○ |
|   | PHP | [BacktickOperator](#genericphpbacktickoperator) |  |  |
|   |  | [CharacterBeforePHPOpeningTag](#genericphpcharacterbeforephpopeningtag) |  |  |
|   |  | [ClosingPHPTag](#genericphpclosingphptag) |  |  |
|   |  | [DeprecatedFunctions](#genericphpdeprecatedfunctions) |  |  |
|   |  | [DisallowAlternativePHPTags](#genericphpdisallowalternativephptags) | ○ | ○ |
|   |  | [DisallowRequestSuperglobal](#genericphpdisallowrequestsuperglobal) |  |  |
|   |  | [DisallowShortOpenTag](#genericphpdisallowshortopentag) | ○ | ○ |
|   |  | [DiscourageGoto](#genericphpdiscouragegoto) |  |  |
|   |  | [ForbiddenFunctions](#genericphpforbiddenfunctions) |  |  |
|   |  | [LowerCaseConstant](#genericphplowercaseconstant) | ○ | ○ |
|   |  | [LowerCaseKeyword](#genericphplowercasekeyword) | ○ | ○ |
|   |  | [LowerCaseType](#genericphplowercasetype) |  | ○ |
|   |  | [NoSilencedErrors](#genericphpnosilencederrors) |  |  |
|   |  | [RequireStrictTypes](#genericphprequirestricttypes) |  |  |
|   |  | [SAPIUsage](#genericphpsapiusage) |  |  |
|   |  | [Syntax](#genericphpsyntax) |  |  |
|   |  | [UpperCaseConstant](#genericphpuppercaseconstant) |  |  |
|   | Strings | [UnnecessaryStringConcat](#genericstringsunnecessarystringconcat) |  |  |
|   | VersionControl | [GitMergeConflict](#genericversioncontrolgitmergeconflict) |  |  |
|   |  | [SubversionProperties](#genericversioncontrolsubversionproperties) |  |  |
|   | WhiteSpace | [ArbitraryParenthesesSpacing](#genericwhitespacearbitraryparenthesesspacing) |  |  |
|   |  | [DisallowSpaceIndent](#genericwhitespacedisallowspaceindent) |  |  |
|   |  | [DisallowTabIndent](#genericwhitespaceincrementdecrementspacing) | ○ | ○ |
|   |  | [IncrementDecrementSpacing](#genericwhitespaceincrementdecrementspacing) |  | ○ |
|   |  | [LanguageConstructSpacing](#genericwhitespacelanguageconstructspacing) |  |  |
|   |  | [ScopeIndent](#genericwhitespacescopeindent) | ○ | ○ |
|   |  | [SpreadOperatorSpacingAfter](#genericwhitespacespreadoperatorspacingafter) |  |  |
|  PEAR | Classes | ClassDeclaration |  |  |
|   | Commenting | ClassComment |  |  |
|   |  | FileComment |  |  |
|   |  | FunctionComment |  |  |
|   |  | [InlineComment](#pearcommentinginlinecomment) |  |  |
|   | ControlStructures | ControlSignature |  |  |
|   |  | MultiLineCondition |  |  |
|   | Files | IncludingFile |  |  |
|   | Formatting | MultiLineAssignment |  |  |
|   | Functions | FunctionCallSignature |  |  |
|   |  | FunctionDeclaration |  |  |
|   |  | [ValidDefaultValue](#pearfunctionsvaliddefaultvalue) |  | ○ |
|   | NamingConventions | ValidClassName |  |  |
|   |  | ValidFunctionName |  |  |
|   |  | ValidVariableName |  |  |
|   | WhiteSpace | ObjectOperatorIndent |  |  |
|   |  | ScopeClosingBrace |  |  |
|   |  | ScopeIndent |  |  |
|  PSR1 | Classes | [ClassDeclaration](#psr1classesclassdeclaration) | ○ | ○ |
|   | Files | [SideEffects](#psr1filessideeffects) | ○ | ○ |
|   | Methods | [CamelCapsMethodName](#psr1methodscamelcapsmethodname) | ○ | ○ |
|  PSR2 | Classes | [ClassDeclaration](#psr2classesclassdeclaration) | ○ | ○ |
|   |  | [PropertyDeclaration](#psr2classespropertydeclaration) | ○ | ○ |
|   | ControlStructures | [ControlStructureSpacing](#psr2controlstructurescontrolstructurespacing) | ○ |  |
|   |  | [ElseIfDeclaration](#psr2controlstructureselseifdeclaration) | ○ | ○ |
|   |  | [SwitchDeclaration](#psr2controlstructuresswitchdeclaration) | ○ | ○ |
|   | Files | [ClosingTag](#psr2filesclosingtag) | ○ | ○ |
|   |  | [EndFileNewline](#psr2filesendfilenewline) | ○ | ○ |
|   | Methods | [FunctionCallSignature](#psr2methodsfunctioncallsignature) | ○ | ○ |
|   |  | [FunctionClosingBrace](#psr2methodsfunctionclosingbrace) | ○ | ○ |
|   |  | [MethodDeclaration](#psr2methodsmethoddeclaration) | ○ | ○ |
|   | Namespaces | [NamespaceDeclaration](#psr2namespacesnamespacedeclaration) | ○ |  |
|   |  | [UseDeclaration](#psr2namespacesusedeclaration) | ○ |  |
|  PSR12 | Classes | [AnonClassDeclaration](#psr12classesanonclassdeclaration) |  | ○ |
|   |  | [ClassInstantiation](#psr12classesclassinstantiation) |  | ○ |
|   |  | [ClosingBrace](#psr12classesclosingbrace) |  | ○ |
|   | ControlStructures | [BooleanOperatorPlacement](#psr12controlstructuresbooleanoperatorplacement) |  | ○ |
|   |  | [ControlStructureSpacing](#psr12controlstructurescontrolstructurespacing) |  | ○ |
|   | Files | [DeclareStatement](#psr12filesdeclarestatement) |  | ○ |
|   |  | [FileHeader](#psr12filesfileheader) |  | ○ |
|   |  | [ImportStatement](#psr12filesimportstatement) |  | ○ |
|   |  | [OpenTag](#psr12filesopentag) |  | ○ |
|   | Functions | [NullableTypeDeclaration](#psr12functionsnullabletypedeclaration) |  | ○ |
|   |  | [ReturnTypeDeclaration](#psr12functionsreturntypedeclaration) |  | ○ |
|   | Keywords | [ShortFormTypeKeywords](#psr12keywordsshortformtypekeywords) |  | ○ |
|   | Namespaces | [CompoundNamespaceDepth](#psr12namespacescompoundnamespacedepth) |  | ○ |
|   | Operators | [OperatorSpacing](#psr12operatorsoperatorspacing) |  | ○ |
|   | Properties | [ConstantVisibility](#psr12propertiesconstantvisibility) |  | ○ |
|   | Traits | [UseDeclaration](#psr12traitsusedeclaration) |  | ○ |
|  Squiz | Arrays | [ArrayBracketSpacing](#squizarraysarraybracketspacing) |  |  |
|   |  | [ArrayDeclaration](#squizarraysarraydeclaration) |  |  |
|   | CSS | ClassDefinitionClosingBraceSpace |  |  |
|   |  | ClassDefinitionNameSpacing |  |  |
|   |  | ClassDefinitionOpeningBraceSpace |  |  |
|   |  | ColonSpacing |  |  |
|   |  | ColourDefinition |  |  |
|   |  | DisallowMultipleStyleDefinitions |  |  |
|   |  | DuplicateClassDefinition |  |  |
|   |  | DuplicateStyleDefinition |  |  |
|   |  | EmptyClassDefinition |  |  |
|   |  | EmptyStyleDefinition |  |  |
|   |  | ForbiddenStyles |  |  |
|   |  | Indentation |  |  |
|   |  | LowercaseStyleDefinition |  |  |
|   |  | MissingColon |  |  |
|   |  | NamedColours |  |  |
|   |  | Opacity |  |  |
|   |  | SemicolonSpacing |  |  |
|   |  | ShorthandSize |  |  |
|   | Classes | [ClassDeclaration](#squizclassesclassdeclaration) |  |  |
|   |  | [ClassFileName](#squizclassesclassfilename) |  |  |
|   |  | [DuplicateProperty](#squizclassesduplicateproperty) |  |  |
|   |  | [LowercaseClassKeywords](#squizclasseslowercaseclasskeywords) |  |  |
|   |  | [SelfMemberReference](#squizclassesselfmemberreference) |  |  |
|   |  | [ValidClassName](#squizclassesvalidclassname) | ○ | ○ |
|   | Commenting | [BlockComment](#squizcommentingblockcomment) |  |  |
|   |  | [ClassComment](#squizcommentingclasscomment) |  |  |
|   |  | [ClosingDeclarationComment](#squizcommentingclosingdeclarationcomment) |  |  |
|   |  | [DocCommentAlignment](#squizcommentingdoccommentalignment) |  |  |
|   |  | [EmptyCatchComment](#squizcommentingemptycatchcomment) |  |  |
|   |  | [FileComment](#squizcommentingfilecomment) |  |  |
|   |  | [FunctionComment](#squizcommentingfunctioncomment) |  |  |
|   |  | [FunctionCommentThrowTag](#squizcommentingfunctioncommentthrowtag) |  |  |
|   |  | [InlineComment](#squizcommentinginlinecomment) |  |  |
|   |  | [LongConditionClosingComment](#squizcommentinglongconditionclosingcomment) |  |  |
|   |  | [PostStatementComment](#squizcommentingpoststatementcomment) |  |  |
|   |  | [VariableComment](#squizcommentingvariablecomment) |  |  |
|   | ControlStructures | ControlSignature | ○ | ○ |
|   |  | ElseIfDeclaration |  |  |
|   |  | ForEachLoopDeclaration | ○ | ○ |
|   |  | ForLoopDeclaration | ○ | ○ |
|   |  | InlineIfDeclaration |  |  |
|   |  | LowercaseDeclaration | ○ | ○ |
|   |  | SwitchDeclaration |  |  |
|   | Debug | JSLint |  |  |
|   |  | JavaScriptLint |  |  |
|   | Files | FileExtension |  |  |
|   | Formatting | OperatorBracket |  |  |
|   | Functions | FunctionDeclarationArgumentSpacing | ○ | ○ |
|   |  | FunctionDeclaration | ○ | ○ |
|   |  | FunctionDuplicateArgument |  |  |
|   |  | [GlobalFunction](#squizfunctionsglobalfunction) |  |  |
|   |  | LowercaseFunctionKeywords | ○ | ○ |
|   |  | MultiLineFunctionDeclaration | ○ | ○ |
|   |  | NamingConventions |  |  |
|   | NamingConventions | [ValidFunctionName](#squiznamingconventionsvalidfunctionname) |  |  |
|   |  | [ValidVariableName](#squiznamingconventionsvalidvariablename) |  |  |
|   | Objects | DisallowObjectStringIndex |  |  |
|   |  | ObjectInstantiation |  |  |
|   |  | ObjectMemberComma |  |  |
|   | Operators | ComparisonOperatorUsage |  |  |
|   |  | IncrementDecrementUsage |  |  |
|   |  | [ValidLogicalOperators](#squizoperatorsvalidlogicaloperators) |  |  |
|   | PHP | CommentedOutCode |  |  |
|   |  | DisallowBooleanStatement |  |  |
|   |  | DisallowComparisonAssignment |  |  |
|   |  | DisallowInlineIf |  |  |
|   |  | DisallowMultipleAssignments |  |  |
|   |  | DisallowSizeFunctionsInLoops |  |  |
|   |  | DiscouragedFunctions |  |  |
|   |  | EmbeddedPhp |  |  |
|   |  | Eval |  |  |
|   |  | [GlobalKeyword](#squizphpglobalkeyword) |  |  |
|   |  | Heredoc |  |  |
|   |  | [InnerFunctions](#squizphpinnerfunctions) |  |  |
|   |  | [LowercasePHPFunctions](#squizphplowercasephpfunctions) |  |  |
|   |  | [NonExecutableCode](#squizphpnonexecutablecode) |  |  |
|   | Scope | [MemberVarScope](#squizscopemembervarscope) |  |  |
|   |  | [MethodScope](#squizscopemethodscope) | ○ | ○ |
|   |  | [StaticThisUsage](#squizscopestaticthisusage) |  |  |
|   | Strings | [ConcatenationSpacing](#squizstringsconcatenationspacing) |  |  |
|   |  | [DoubleQuoteUsage](#squizstringsdoublequoteusage) |  |  |
|   |  | [EchoedStrings](#squizstringsechoedstrings) |  |  |
|   | WhiteSpace | [CastSpacing](#squizwhitespacecastspacing) |  | ○ |
|   |  | ControlStructureSpacing | ○ | ○ |
|   |  | FunctionClosingBraceSpace |  |  |
|   |  | [FunctionOpeningBraceSpace](#squizwhitespacefunctionopeningbracespace) |  |  |
|   |  | [FunctionSpacing](#squizwhitespacefunctionspacing) |  |  |
|   |  | [LanguageConstructSpacing](#squizwhitespacelanguageconstructspacing) |  |  |
|   |  | LogicalOperatorSpacing |  |  |
|   |  | MemberVarSpacing |  |  |
|   |  | [ObjectOperatorSpacing](#squizwhitespaceobjectoperatorspacing) |  |  |
|   |  | OperatorSpacing |  |  |
|   |  | PropertyLabelSpacing |  |  |
|   |  | ScopeClosingBrace | ○ | ○ |
|   |  | ScopeKeywordSpacing | ○ | ○ |
|   |  | [SemicolonSpacing](#squizwhitespacesemicolonspacing) |  |  |
|   |  | [SuperfluousWhitespace](#squizwhitespacesuperfluouswhitespace) | ○ | ○ |

# ルール詳細

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

## Generic
### Generic.Arrays.ArrayIndent

配列の要素をスペース4つでインデントされているかチェックします。
インデントの数は[カスタマイズ可能](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Customisable-Sniff-Properties#genericarraysarrayindent)です。

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

### Generic.Arrays.DisallowLongArraySyntax

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

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

### Generic.Arrays.DisallowShortArraySyntax

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

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

### Generic.Classes.DuplicateClassName

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

### Generic.Classes.OpeningBraceSameLine

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

```php
class OK {}

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

### Generic.CodeAnalysis.AssignmentInCondition

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

```php
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
<?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）
完全に空であるか、空文字またはコメントだけの場合も空とみなされます。


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

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

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

### Generic.CodeAnalysis.ForLoopShouldBeWhileLoop

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

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

### Generic.CodeAnalysis.ForLoopWithTestFunctionCall

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

```php
$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ループでジャンピングするインクリメンターを検出します。

```php
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のみ設定されている条件が検出されます。

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

### Generic.CodeAnalysis.UnnecessaryFinalModifier

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

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

### Generic.CodeAnalysis.UnusedFunctionParameter

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

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

function fuga($fuga) {
}
```

### Generic.CodeAnalysis.UselessOverridingMethod

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

```php
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ブロックが基本的なフォーマットに従っていることを確認します。

```php
/** */

/** example
 */
```

### Generic.Commenting.Fixme

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

```php
// fixme: hoge
```

### Generic.Commenting.Todo

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

```php
// todo: hoge
```

### Generic.ControlStructures.DisallowYodaConditions

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

```php
$value = 10;

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

### Generic.ControlStructures.InlineControlStructure

インライン制御ステートメントが存在しないことを確認します。
[カスタマイズ](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Customisable-Sniff-Properties#genericcontrolstructuresinlinecontrolstructure)によりエラーではなく警告にすることが可能です。

```php
$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

行末文字（改行コード）が正しいことを確認します。
行末文字は[カスタマイズ可能](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Customisable-Sniff-Properties#genericfileslineendings)です。

### Generic.Files.LineLength

ファイル内のすべての行の長さをチェックします。
長さが80文字を超えると警告、100文字を超えるとエラーになります。
文字数は[カスタマイズ可能](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Customisable-Sniff-Properties#genericfileslinelength)です。

### Generic.Files.LowercasedFilename

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

### Generic.Files.OneClassPerFile

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

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

### Generic.Files.OneInterfacePerFile

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

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

### Generic.Files.OneObjectStructurePerFile

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

- Generic.Files.OneClassPerFile
- Generic.Files.OneInterfacePerFile
- Generic.Files.OneTraitPerFile

### Generic.Files.OneTraitPerFile

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

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

### Generic.Formatting.DisallowMultipleStatements

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

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

### Generic.Formatting.MultipleStatementAlignment

代入演算子の配置をチェックします。複数の隣接する割り当てがある場合は、各割り当ての等号が揃っていることを確認します。
パディングの最大量は[カスタマイズ可能](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Customisable-Sniff-Properties#genericformattingmultiplestatementalignment)です。

```php
$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

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

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

### Generic.Formatting.SpaceAfterCast

キャストトークンの後にスペースが1つあることを確認します。NoSpaceAfterCastの逆です。
スペースの数などを[カスタマイズ可能](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Customisable-Sniff-Properties#genericformattingspaceaftercast)です。

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

### Generic.Formatting.SpaceAfterNot

`!`演算子の後の間隔をチェックします。デフォルトでは演算子の後にスペースが1つあることを確認します。
スペースの数などを[カスタマイズ可能](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Customisable-Sniff-Properties#genericformattingspaceafternot)です。

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

### Generic.Formatting.SpaceBeforeCast

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

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

### Generic.Functions.CallTimePassByReference

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

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

### Generic.Functions.FunctionCallArgumentSpacing

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

```php
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

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

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

### Generic.Functions.OpeningFunctionBraceKernighanRitchie

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

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

### Generic.Metrics.CyclomaticComplexity

関数の循環的複雑度（McCabe）をチェックします。
10より大きいと警告、20より大きいとエラーが検出されます。この閾値は[カスタマイズ可能](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Customisable-Sniff-Properties#genericmetricscyclomaticcomplexity)です。

### Generic.Metrics.NestingLevel

メソッドのネストレベルをチェックします。
5より大きいと警告、10より大きいとエラーが検出されます。この閾値は[カスタマイズ可能](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Customisable-Sniff-Properties#genericmetricsnestinglevel)です。

### Generic.NamingConventions.CamelCapsFunctionName

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


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

### Generic.NamingConventions.ConstructorName

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

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

### Generic.NamingConventions.UpperCaseConstantName

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

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

### Generic.PHP.BacktickOperator

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

```php
$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関数の使用を推奨しません。

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

### Generic.PHP.DisallowAlternativePHPTags

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

### Generic.PHP.DisallowRequestSuperglobal

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

```php
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()` の使用を推奨しません。
使用を禁止する関数は[カスタマイズ可能](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Customisable-Sniff-Properties#genericphpforbiddenfunctions)です。

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

### Generic.PHP.LowerCaseConstant

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

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

### Generic.PHP.LowerCaseKeyword

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

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

### Generic.PHP.LowerCaseType

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

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

### Generic.PHP.NoSilencedErrors

接頭辞が`@`のコードが検出された場合、エラーまたは警告をスローします。
エラーか警告か[カスタマイズ可能](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Customisable-Sniff-Properties#genericphpnosilencederrors)です。

```php
@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の逆です。

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

### Generic.Strings.UnnecessaryStringConcat

2つの文字列が連結されていないことを確認します。
[オプション](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Customisable-Sniff-Properties#genericstringsunnecessarystringconcat)により複数行に分割されたケースは許可することができます。

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

### Generic.VersionControl.GitMergeConflict

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

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

### Generic.VersionControl.SubversionProperties

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

### Generic.WhiteSpace.ArbitraryParenthesesSpacing

任意の括弧の内側の空白をチェックして修正します。
（関数の呼び出し、配列、制御構造を除く）
スペースの数などは[カスタマイズ可能](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Customisable-Sniff-Properties#genericwhitespacearbitraryparenthesesspacing)です。


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

### Generic.WhiteSpace.DisallowSpaceIndent

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

### Generic.WhiteSpace.DisallowTabIndent

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

### Generic.WhiteSpace.IncrementDecrementSpacing

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

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

### Generic.WhiteSpace.LanguageConstructSpacing

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

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

### Generic.WhiteSpace.ScopeIndent

制御構造が正しく定義およびインデントされていることを確認します。
インデントのサイズなど[カスタマイズ可能](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Customisable-Sniff-Properties#genericwhitespacescopeindent)です。

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

### Generic.WhiteSpace.SpreadOperatorSpacingAfter

スプレッド演算子とそれが適用される変数/関数呼び出しの間の間隔を確認します。
スペースの数などは[カスタマイズ可能](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Customisable-Sniff-Properties#genericwhitespacespreadoperatorspacingafter)です。

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

## PEAR

### PEAR.Commenting.InlineComment

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

```php
// OK
# NG
```

### PEAR.Functions.ValidDefaultValue

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

```php
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](https://www.php-fig.org/psr/psr-1/#23-side-effects)

### PSR1.Methods.CamelCapsMethodName

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

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

## PSR2

### PSR2.Classes.ClassDeclaration

クラスの宣言をチェックし、その継承が正しいことを確認します。
[Extends and Implements - PSR2](https://www.php-fig.org/psr/psr-2/#41-extends-and-implements)
オプションで[カスタマイズ可能](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Customisable-Sniff-Properties#psr2classesclassdeclaration)です。

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

### PSR2.Classes.PropertyDeclaration

プロパティが正しく宣言されていることを確認します。
[Properties - PSR2](https://www.php-fig.org/psr/psr-2/#42-properties)

```php
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

括弧で囲まれたステートメント内の制御構造に正しいパディングがあることを確認します。
デフォルトは前後のスペースがゼロであることを確認しますが、
スペースの数は[カスタマイズ可能](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Customisable-Sniff-Properties#psr2controlstructurescontrolstructurespacing)です。

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

### PSR2.ControlStructures.ElseIfDeclaration

else ifステートメントがないことを確認します（elseifを代わりに使用する必要があります）。
[if, elseif, else - PSR2](https://www.php-fig.org/psr/psr-2/#51-if-elseif-else)

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

### PSR2.ControlStructures.SwitchDeclaration

すべてのswitchステートメントが正しく定義されていることを確認します。
[switch, case - PSR2](https://www.php-fig.org/psr/psr-2/#52-switch-case)

```php
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

関数呼び出し形式が正しいことを確認します。
引数のインデント、スペースの数、改行について[カスタマイズ可能](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Customisable-Sniff-Properties#psr2methodsfunctioncallsignature)です。

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

### PSR2.Methods.FunctionClosingBrace

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

```php
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

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

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

### PSR2.Namespaces.NamespaceDeclaration

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

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

### PSR2.Namespaces.UseDeclaration

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

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

## PSR12

### PSR12.Classes.AnonClassDeclaration

匿名クラスの宣言が正しいことを確認します。
[Anonymous Classes - PSR12](https://www.php-fig.org/psr/psr-12/#8-anonymous-classes)
インデントの数は[カスタマイズ可能](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Customisable-Sniff-Properties#psr12classesanonclassdeclaration)です。

```php
$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

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

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

### PSR12.Classes.ClosingBrace

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

```php
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

制御構造のブール演算子が正しい場所にあることを確認します。
条件間のブール演算子は、行の先頭または末尾にある必要があります。また、行の先頭か末尾のどちらかに統一する必要があります。
[カスタマイズ](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Customisable-Sniff-Properties#psr12controlstructuresbooleanoperatorplacement)により先頭か末尾か明示的に設定することができます。

```php
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

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

インデントの数は[カスタマイズ可能](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Customisable-Sniff-Properties#psr12controlstructurescontrolstructurespacing)です。

```php
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ステートメントの形式をチェックします。

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

### PSR12.Files.FileHeader

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

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

### PSR12.Files.ImportStatement

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

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

### PSR12.Files.OpenTag

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

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

### PSR12.Functions.NullableTypeDeclaration

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

```php
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つ必要です
- 戻り値の型宣言では、コロンの前にスペースがあってはなりません

```php
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)

```php
$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を超えるとエラーになりますが、深さは[カスタマイズ可能](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Customisable-Sniff-Properties#psr12namespacescompoundnamespacedepth)です。

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

### PSR12.Operators.OperatorSpacing

演算子の周囲に有効な間隔があることを確認します。
オプションにより[カスタマイズ可能](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Customisable-Sniff-Properties#psr12operatorsoperatorspacing)です。

```php
$num = 2;

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

### PSR12.Properties.ConstantVisibility

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

```php
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インポート文が正しく定義されていることを確認します。

```php
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

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

```php
$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

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

```php
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

クラスの宣言をチェックし、その継承が正しいことを確認します。
[カスタマイズ オプション](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Customisable-Sniff-Properties#squizclassesclassdeclaration)

```php
 class A // error SpaceBeforeKeyword
 {
}

class B // error MultipleClasses
{
}
```

### Squiz.Classes.ClassFileName

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

```php:Fuga.php
class Hoge // NoMatch
{
}
```

### Squiz.Classes.DuplicateProperty

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

### Squiz.Classes.LowercaseClassKeywords

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

```php
CLASS Hoge// FoundUppercase
{
}
```

### Squiz.Classes.SelfMemberReference

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

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

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

### Squiz.Classes.ValidClassName

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

```php
class valid_class_name // NotCamelCaps
{
}
```

### Squiz.Commenting.BlockComment

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

```php
/* SingleLine */

/* NoNewLine
 */
```

### Squiz.Commenting.ClassComment

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

```php
/*
 * WrongStyle
 */
class ClassComment
{
}
```

### Squiz.Commenting.ClosingDeclarationComment

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

```php:Expected&nbsp;//end&nbsp;class
class Hoge
{
}
```

### Squiz.Commenting.DocCommentAlignment

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

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

### Squiz.Commenting.EmptyCatchComment

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

```php: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

長い条件の最後にコメントがあることを確認します。
終了コメントが必要になる行数、終了コメントのフォーマットは[カスタマイズ可能](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Customisable-Sniff-Properties#squizcommentinglongconditionclosingcomment)です。

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

### Squiz.Commenting.PostStatementComment

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

```php
if (true) { // Found
}
```

### Squiz.Commenting.VariableComment

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

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

### Squiz.Functions.GlobalFunction

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

### Squiz.NamingConventions.ValidFunctionName

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

- マジックメソッド以外のダブルアンダースコアを許可しない
- メソッド名はキャメルキャップ形式とする

```php
function __hoge() // DoubleUnderscore
{
}

function Fuga() // NotCamelCaps
{
}
```

```php
class Hoge
{
    public function __hoge() // MethodDoubleUnderscore
    {
    }

    public function Fuga() // ScopeNotCamelCaps
    {
    }
}
```

### Squiz.NamingConventions.ValidVariableName

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

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

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

### Squiz.Operators.ValidLogicalOperators

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

```php
if (true and false) { // NotAllowed
}

if (true or false) { // NotAllowed
}
```

### Squiz.PHP.GlobalKeyword

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

### Squiz.PHP.InnerFunctions

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

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

### Squiz.PHP.LowercasePHPFunctions

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

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

### Squiz.PHP.NonExecutableCode

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

```php
function hoge()
{
    return; // ReturnNotRequired
}

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

### Squiz.Scope.MemberVarScope

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

```php
class Hoge
{
    var $hoge; // Missing
}
```

### Squiz.Scope.MethodScope

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

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

### Squiz.Scope.StaticThisUsage

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

### Squiz.Strings.ConcatenationSpacing

連結演算子の周囲のスペースについて確認します。
デフォルトでは、連結演算子の前後にスペースがないことを保証します。
スペースの数は[カスタマイズ可能](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Customisable-Sniff-Properties#squizstringsconcatenationspacing)です。

### Squiz.Strings.DoubleQuoteUsage

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

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

### Squiz.Strings.EchoedStrings

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

```php
echo('hoge'); // HasBracket
```

### Squiz.WhiteSpace.CastSpacing

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

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

### Squiz.WhiteSpace.FunctionOpeningBraceSpace

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

### Squiz.WhiteSpace.FunctionSpacing

関数同士の間隔と、その前後の制御構造との間隔をチェックします。
デフォルトの間隔は２行ですが、それぞれ[カスタマイズ可能](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Customisable-Sniff-Properties#squizwhitespacefunctionspacing)です。

```php
class FunctionSpacing
{

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

    public function fuga()
    {
    } // AfterLast

}
```

### Squiz.WhiteSpace.LanguageConstructSpacing

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

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

### Squiz.WhiteSpace.ObjectOperatorSpacing

オブジェクト演算子の前後に空白がないことを確認してください。
オプションにより改行した時の検証が[カスタマイズ可能](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Customisable-Sniff-Properties#squizwhitespaceobjectoperatorspacing)です。

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

### Squiz.WhiteSpace.SemicolonSpacing

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

### Squiz.WhiteSpace.SuperfluousWhitespace

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

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

オプションにより[カスタマイズ可能](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Customisable-Sniff-Properties#squizwhitespacesuperfluouswhitespace)です。

# 訂正等

## PHP_CodeSnifferのバージョン

3.0 → ^3.5

## ルール一覧

- PSR12.Keywords.ShortFormTypeKeywordsを追加（記載漏れ）