Skip to content

コーディング規約

このドキュメントは、CI で自動チェックされない項目を中心に、レビュー時に確認すべき規約をまとめたものです。自動チェックされる項目は各ツールの設定・CI に任せ、ここでは「何でチェックされるか」の記載にとどめます。

CI で自動チェックされるもの

  • コーディングスタイル・命名: WordPress Coding Standards を採用。PHPCS で自動チェック。
  • 型・静的分析: PHPStan(Level 4)で自動チェック。
  • レイヤー依存関係: Deptrac で自動チェック。
  • PSR-4: 名前空間とファイルパスの対応を CI で自動チェック(ローカルコマンドは コマンド一覧 参照)。
  • 単体テスト: PHPUnit で自動チェック。

レビューで確認する項目(自動チェック外)

以下は CI では検出されないため、レビュー時に意識して確認する。

0. パス・オートロード・メッセージ

  • パス: PathConstantsget_templates_path() 等)または ROOT / VERSION を使用。個別ファイル用定数は作らない。
  • 読み込み: Composer PSR-4 + use で自動化。vendor/autoload.phpconnector.php で読み込み済みのため重複しない。
  • メッセージ文言: すべて core_src/Constants/Messages.php で定義し、呼び出し側は Messages::定数名 を参照。

メッセージ定義の例外(P-WORLD archive 管理サブシステム)

上記 Messages を原則とするが、P-WORLD メールアーカイブ等の管理専用サブシステムでは、サイト全体向けの定数と分けるため次に置きうる。

  • 管理画面 UI ・ AJAX 応答のユーザー向け文言: PworldArchiveCopycore_src/Constants/PworldArchiveCopy.php
  • ログ用(error_log 等): PworldArchiveErrorLogcore_src/Constants/PworldArchiveErrorLog.php

Deptrac により Service 層等が App\Admin 配下に専用定数を定義しづらい一方、上記は App\Constants に置くことで層の依存を保ちながら P-WORLD 専用の文言を集約できる。新規の P-WORLD 管理系向け文字列を追加する際はこの方針に従う。

1. 型宣言・DocBlock・use 文(PHPStan で拾いきれない部分)

  • DocBlock では @param string[], @return array<int, Entity> など具体型を記載。
  • クラス参照は use でインポートし FQCN を避ける(例外: \wpdb, \DateTime 等)。

2. 配列マージ

  • 型推論を保つため、配列の結合は [ ...$a, ...$b ] を優先。array_mergemixed[] になりやすい。数値キーはどちらも再インデックスされる。

3. 責務分離

  • 配列の有無・要素数だけで判定できる内容は View 側で判定し、バックエンドで冗長なフラグを追加しない。複雑なビジネス判定・セキュリティ上の理由がある場合はバックエンドで判定可。

4. 依存性注入・名前付き引数

  • 依存はコンストラクタで注入。コンストラクタ内で new して実装に直接依存しない。
  • 名前付き引数(必須): 引数 2 つ以上は名前付きで記述。

5. SQL

  • N+1 を避け、IN 句などで一括取得。ORDER BY 等はホワイトリスト(Entity 定数・['ASC','DESC'])で組み立て、生の文字列連結禁止。

6. Entity 定数・キャッシュ

  • DB カラム参照は Entity の定数(例: $row->{Entity::COLUMN_NAME})を使用。
  • 読み取り頻度の高いデータは wp_cache_get / wp_cache_set を検討。

7. セキュリティ

  • 外部取得は wp_remote_get / wp_remote_retrieve_body 等の WordPress API を優先。file_get_contents( $url ) 等は避ける。

命名規則(参考)

WordPress Coding Standards に準拠。PHPCS で自動チェック。対象ごとの規則は下表のとおり。

対象規則備考
クラス・インターフェースPascalCase例: HallRepository, DailyArticleServiceInterface
関数・メソッドsnake_case例: get_templates_path(), find_by_ids()
変数snake_case例: $post_id, $result_list
定数UPPER_SNAKE_CASE例: Messages::ERROR_INVALID_ID, Entity::COLUMN_NAME