コードの整合性をPHP_CodeSnifferで評価する
今回PHPコードをがっつり書いて、可読性や正確性を整えたうえでGitHubにプッシュしたいと考えていたところ、コードの自動補正や不適切な箇所の検出を行ってくれるツール『PHP_CodeSniffer』を発見しました。
PHP_CodeSnifferについての説明はこちらをご覧ください。
PHP_CodeSniffeの使用環境を整える
今回はエラー値を読み解く内容となりますので、環境構築は下記をご覧ください。
PHPコーディング規則PSR-12
コマンド
phpcs ファイル.php //コーディングチェック
phpcbf ファイル.php //自動整形(可能な範囲)
phpcs --standard=PSR12 ディレクトリ //ディレクトリ全体をチェック
早速エラー値をみていく
とんでもなくエラーがたくさん出力されたので、最初は驚きました。
早速エラー内容をchatGPTに読み込ませて、見ていきます。
・エラー内容:Header blocks must be separated by a single blank line
ファイル冒頭に空行が足りない
・エラー内容:Expected 1 newline at end of file
ファイルの最後に改行が必要
<?php
// 開始 空行を開ける
// 終了 空行を開ける
?>
エラー内容:End of line character is invalid; expected "\n" but found "\r\n"
改行コードが Windows(CRLF)になっている
VSCodeの右下タブの赤枠を選択して、「LF」に変更します。
エラー内容:Line indented incorrectly; expected at least 4 spaces, found 2
インデントが2スペースで、PSR-12は4スペース推奨
VSCodeの右下タブの赤枠を選択して、「スペース:4」に変更します。
エラー内容:No space found after comma in argument list
カンマの後にスペースが必要
エラー内容:Expected at least 1 space before "."
ドット(メソッドチェーンなど)の前にスペースが必要
エラー内容:Expected 0 spaces before semicolon
セミコロンの前にスペースがある
その他
- { の位置が不正
function foo() の次の行に
{ //次の行に{を置く
}
- if, while の後にスペースなし
if (...) { //このように1スペース必要
自動整形コマンド
phpcbfコマンドを使用して、これまでのエラーを一括で解消します。
./vendor/bin/phpcbf --standard=PSR12 ファイル名
REMAINING=0となれば、phpcbfコマンドで修正できるエラー内容はないよ、
ということになります。
指定されたコーディング規約に違反している箇所が見つからなかったと分かりました。
クラス・名前空間のエラー
phpcbfを実行しある程度成形されましたが、まだまだ変更の個所が指摘されていました。
行 | エラー |説明
1 | WARNING | A file should declare new symbols (classes, functions, constants, etc.) and cause no other side effects,
| | or it should execute logic with side effects, but should not do both. The first symbol is defined on
| | line 4 and the first side effect is on line 209.
4 | ERROR | Each class must be in a namespace of at least one level (a top-level vendor name)
39 | ERROR | Each class must be in a file by itself
39 | ERROR | Each class must be in a namespace of at least one level (a top-level vendor name)
・エラー内容:A file should declare new symbols ... or execute logic ... but not both」
・エラー内容:Each class must be in a file by itself
PSR-12では「1ファイル1クラス」がルールとなっており、クラスごとにファイルを分ける必要があります。
クラスや関数定義は 「定義専用ファイル」 へ、
実際に動かす処理は 「実行専用ファイル」 に分ける必要があります。
エラー内容:Each class must be in a namespace of at least one level
クラスに名前空間(namespace) がないとエラーになります。
多数の開発者や大規模なシステムでの開発において、クラス名の重複が発生しがちです。
そこで、クラスがどのモジュールに属しているかを示すために Namespace を用いることで、同じ名前のクラスが存在していても、モジュールごとに識別され、名前の衝突を避けることが可能になります。
クラスごとの定義専用ファイル
namespace GroupA; //名前空間の指定
または
namespace GroupA\Common\Mail; //サブ名前空間
function play () {
echo '野球';
}
main.phpなどの実行専用ファイル
require_once 'index.php'; //名前空間の呼び出し
GroupA\play();
サブ名前空間の呼び出し
GroupA\Common\Mail\play();
//サブクラス名が長くなる場合、エイリアスを作成して短縮して呼び出すことが可能
use GroupA\Common\Mail\ as Mail;
Mail\play();
関数を直接指定する方法
use 名前空間名\クラス名
use function 名前空間名\関数名
use const 名前空間名\定数名
例)
use function DroupA\Common\Mail\play;
→ play();で呼び出す
名前空間の概要
名前空間とは?PHP 【分かりやすい解説シリーズ #63】【プログラミング】
徳田 啓【プログラミング学習チャンネル】
以上、クラスごとにファイルを分割することで、各ファイルに単一の責任を持たせ、
より保守性や可読性の高い設計が実現できました。


