概要
PHP_CodeSnifferにはどのようなルールがあるのか調べてまとめています。
バージョン^3.5を対象としています。
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)に含まれていないので省略します。
ルール詳細
それぞれのルールがどのようなチェックを行うのか、簡単な例と共にまとめます。
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
ファイル名とファイル内に含まれるクラスの名前が一致することをテストします。
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 ...コメントをチェックします。
class Hoge
{
}
Squiz.Commenting.DocCommentAlignment
ドキュメントコメントのアスタリスクが正しく整列していることをテストします。
/**
*NoSpaceAfterStar
* SpaceBeforeStar
*/
class Hoge
{
}
Squiz.Commenting.EmptyCatchComment
コメントなしの空のcatch句をチェックします。
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
タグについて検証します。
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を追加(記載漏れ)