PHP CodeSnifferにおけるPSR1,2の検知箇所と対応するSniffer

# PSR1

##2. ファイル

### 2.1. PHPタグ

> PHPコードは「<?php ?>」または短縮記述の「<?= ?>」を使用しなければなりません。それ以外のタグを使用してはいけません。

- **Generic.PHP.DisallowShortOpenTag**

### 2.2. 文字コード

> 文字コードは、UTF-8（BOM無し）でなければなりません。

- **Generic.Files.ByteOrderMark**

### 2.3. 副作用

> 新たなシンボル（クラス、関数、定数など）を宣言するためのファイルと、副作用のある処理を行うためのファイルは、分けるべきです。一つのファイルの中で両方を行うべきではありません。

- **PSR1.Files.Sid​​eEffects**

## 3. 名前空間とクラス名

> PSR-0に準拠しなければなりません。
> 各クラスが、（トップレベルのベンダー名のように）少なくとも１レベルの名前空間となります。

- **PSR1.Classes.ClassDeclaration**

> クラス名は、StudlyCaps記法で定義しなければなりません。

- **Squiz.Classes.ValidClassName**

## 4. クラス定数、プロパティ及びメソッドについて

### 4.1. 定数

> クラス定数は総じてアンダースコア文字を区切り文字として大文字で定義しなければなりません。

- **Squiz.Classes.ValidClassName**

### 4.3. Methods

> メソッド名はcamelCase記法で定義しなければなりません。

- **PSR1.Methods.CamelCapsMethodName**

# PSR2

## 2. 一般

### 2.2 ファイル

> 全てのPHPファイルの改行コードは、LFでなければなりません。

- **Generic.Files.LineEndings**

> 全てのPHPファイルは、最後に空行を入れなければなりません。

- **PSR2.Files.EndFileNewline**

> PHPだけが書かれたファイルについては、終了タグ「?>」を省略しなければなりません。

- **PSR2.Files.ClosingTag**

### 2.3. 行

> 行の長さのソフトリミットは１２０文字を上限とします。 自動スタイルチェッカーはソフトリミットで警告しなければなりませんが、エラーを出してはいけません。

- **Generic.Files.LineLength**

> 行末に空白文字列を含んではいけません。

- **Squiz.WhiteSpace.SuperfluousWhitespace**
- **Squiz.WhiteSpace.SuperfluousWhitespace.StartFile**
- **Squiz.WhiteSpace.SuperfluousWhitespace.EndFile**
- **Squiz.WhiteSpace.SuperfluousWhitespace.EmptyLines**

> １行に複数のステートメントがあってはいけません。

- **Generic.Formatting.DisallowMultipleStatements**

### 2.4. インデント

> インデントは４つのスペースとしなければなりません。タブによるインデントは用いてはなりません。

- **Generic.WhiteSpace.ScopeIndent**
- **Generic.WhiteSpace.DisallowTabIndent**

### 2.5. 予約語とTrue/False/Null

> PHPの予約語は小文字で使用しなければなりません。

- **Generic.PHP.LowerCaseKeyword**

> PHP定数であるtrue、falseそしてnullは小文字でなければなりません。

- **Generic.PHP.LowerCaseConstant**

## 3. 名前空間とuse演算子による定義

> 名前空間の定義の後に空行が必要です。

- **PSR2.Namespaces.NamespaceDeclaration**

> use定義は、名前空間宣言の後でなければなりません。
> 定義ごとにuse演算子が必要です。
> use定義のブロックの後には空行が必要です。

- **PSR2.Namespaces.UseDeclaration**

## 4. クラス、プロパティ及びメソッド

> extendsとimplementsは、クラス名と同じ行で定義されなけれなりません。
> クラスの開き括弧は次の行に記述しなければなりません。また閉じ括弧は本文最後の次の行に記述しなければなりません。
> implements定義は、インデントにより揃えることで、複数行に分割しても構いません。 その際、最初の定義も次の行からはじめるものとし、１行に１つのインターフェイスを定義しなければなりません。

- **PSR2.Classes.ClassDeclaration**

### 4.2. プロパティ

> アクセス修飾子は、全てのプロパティに定義しなければなりません。
> プロパティ定義に、varは使用してはいけません。
> ステートメントあたりに複数のプロパティ定義があってはなりません。
> プロパティ名に、protectedまたはprivateを示すためにシングルアンダースコアを使用すべきではありません。

- **PSR2.Classes.PropertyDeclaration**

### 4.3. メソッド

> アクセス修飾子は、全てのメソッドに定義しなければなりません。

- **Squiz.Scope.MethodScope**
- **Squiz.WhiteSpace.ScopeKeywordSpacing**

> メソッド名の後ろにスペースを使用してはいけません。 開き括弧は次の行に記述しなければなりません。また閉じ括弧は本文最後の次の行に記述しなければなりません。 開き括弧の後ろや、閉じ括弧の前にスペースがあってはいけません。

- **PSR2.Methods.FunctionClosingBrace**
- **Squiz.Functions.FunctionDeclaration**
- **Squiz.Functions.LowercaseFunctionKeywords**

### 4.4. メソッドの引数

> 引数リストでは、それぞれのカンマの前にスペースがあってはいけません。 また各カンマの後ろには１スペースおかなければなりません。

- **Squiz.Functions.FunctionDeclarationArgumentSpacing**
- **Squiz.Functions.FunctionDeclarationArgumentSpacing.SpacingAfterHint**

> デフォルト値を持つ引数は、引数リストの最後に配置しなければなりません。

- **PEAR.Functions.ValidDefaultValue**

> 引数リストは、インデントにより揃えることで、複数行に分割しても構いません。 その際、最初の定義も次の行からはじめるものとし、１行に１つの引数を定義しなければなりません。
> 引数リストを複数行の分割配置としている場合、閉じ括弧と開き中括弧の間にはスペースを含め同じ行に配置する必要があります。

- **Squiz.Functions.MultiLineFunctionDeclaration**

### 4.5. abstract, final, and static

> abstractとfinalはアクセス修飾子の前に定義しなければなりません。
> staticはアクセス修飾子の後に定義しなければなりません。

- **PSR2.Methods.MethodDeclaration**

### 4.6. メソッド及び関数の呼び出し

> メソッドや関数の呼び出し時は、メソッドや関数名と開き括弧の間にスペースがあってはなりません。 また開き括弧の後や、閉じ括弧の前にスペースがあってもいけません。 引数リストの前にスペースがあってはなりませんが、各カンマの後に１スペースが必要です。
> 引数リストは、インデントにより揃えることで、複数行に分割しても構いません。 その際、最初の定義も次の行からはじめるものとし、１行に１つの引数を定義しなければなりません。

- **Generic.Functions.FunctionCallArgumentSpacing**
- **PSR2.Methods.FunctionCallSignature.SpaceAfterCloseBracket**
- **PSR2.Methods.FunctionCallSignature.OpeningIndent**

## 5. 制御構造

> 制御構造キーワードの後には１スペースを設けなければなりません。
> 開き括弧の後にスペースを配置してはなりません。
> 閉じ括弧の前にスペースを配置すべきではありません。
> 開き括弧と閉じ中括弧の間にはスペースを挟まなければなりません。
> 構造本文は１インデント下げなければなりません。
> 閉じ括弧は構造本文の後に改行して配置しなければなりません。


- **Squiz.ControlStructures.ControlSignature**
- **Squiz.WhiteSpace.ControlStructureSpacing.SpacingAfterOpen**
- **Squiz.WhiteSpace.ControlStructureSpacing.SpacingBeforeClose**
- **Squiz.WhiteSpace.ScopeClosingBrace**
- **Squiz.ControlStructures.ForEachLoopDeclaration**
- **Squiz.ControlStructures.ForLoopDeclaration**
- **Squiz.ControlStructures.LowercaseDeclaration**
- **PSR2.ControlStructures.ControlStructureSpacing**
- **Squiz.ControlStructures.ForEachLoopDeclaration.AsNotLower**

> 各構造本文は、中括弧で囲わなければなりません。 これは構造の見え方を標準化し、追加実装等が発生した際のエラーを抑えます。

- **Generic.ControlStructures.InlineControlStructure**

### 5.1. if, elseif, else

> 全てのキーワードが１単語に見えるように、else ifではなくelseifを使うべきです。

- **PSR2.ControlStructures.ElseIfDeclaration**

### 5.2. switch, case

> case文はswitchからインデントし、break（またはその他の終端キーワード）は、case内本文と同じレベルのインデントで揃えなければなりません。 また意図的に処理スルーさせる場合は「// no break」等、コメントしなければなりません。

- **PSR2.ControlStructures.SwitchDeclaration**

## 6. Closure

> クロージャは、functionキーワードの後にスペースを、useキーワードの前後にスペースが必要です。
> 開き括弧は同じ行に記述しなければなりません。また閉じ括弧は本文最後の次の行に記述しなければなりません。
> 引数または変数リストの開き括弧の後にスペースがあってはなりません。 また閉じ括弧の前にスペースがあってもなりません。
> 引数または変数リストの前にスペースがあってはなりませんが、各カンマの後に１スペースが必要です。
> デフォルト値を持つ引数は、引数リストの最後に配置しなければなりません。
> 引数または変数リストは、インデントにより揃えることで、複数行に分割しても構いません。 その際、最初の定義も次の行からはじめるものとし、１行に１つの引数または変数を定義しなければなりません。
> 引数または変数リストを複数行の分割配置としている場合、閉じ括弧と開き中括弧の間にはスペースを含め同じ行に配置する必要があります。

- **Squiz.Functions.MultiLineFunctionDeclaration**

# 参考

[PSR-1 基本コーディング規約（日本語）](http://www.infiniteloop.co.jp/docs/psr/psr-1-basic-coding-standard.html)
[PSR-2 コーディングガイド（日本語）](http://www.infiniteloop.co.jp/docs/psr/psr-2-coding-style-guide.html)

[PSR1 ruleset.xml](https://github.com/squizlabs/PHP_CodeSniffer/blob/master/src/Standards/PSR1/ruleset.xml)
[PSR2 ruleset.xml](https://github.com/squizlabs/PHP_CodeSniffer/blob/master/src/Standards/PSR2/ruleset.xml)