2019年5月17日10:50:12
はじめに
現在は随時記載しており、後日体系的に整理します。
PHPのコードスタイルが自由すぎることで、プロジェクト内でN通りの記述方法が混在することが問題です。特に以下のケースが挙げられます:
- 単純な機能に複数のコールバック関数をネストし、可読性が著しく低下
- if/else文のコードブロックに{}を省略(IDE依存でエラーになり得る)
- 匿名関数の多重ネストによりコード再利用性が失われる
これらの記法はPHP特有の甘えであり、他の言語では通用しません。Javaの設計思想に触れることがPHPの質の向上に繋がります。
PSR規約
PSR-1,2,3,4,6,7を部分的に採用していますが、全員が完全順守を求めるのは現実的ではありません。
- 日本語訳:psr.phphub.org
- 参考規則:w3cschool規約
IDE統一
容器やコールバック関数のサポートを考慮し、可能な限り共通IDEを使用することを推奨します。
命名規約
キャメルケースを統一し、変数名は英語の可読単語を採用してください。
namespace App\Service;
class OrderProcessingService {
public static function getInventoryList(int $storeId, int $orderId) {
// 処理内容
}
}
注釈タグはIDEで自動補完されるため、必須です。
コードレイヤー
- Controller層
- ServiceInterfaceインターフェース
- Service実装層
- Abstract抽象層
- Models層
- APIバージョン管理層
抽象層とインターフェースはインスタンス化不可であり、依存注入で多態を実現します。
コーディングルール
- UTF-8無BOM形式を使用し、文字化けを防止
- MySQLはutf8mb4を推奨
- インデントはIDEの自動フォーマット機能を使用
- PHPキーワードは小文字必須
- if/else文は必ず{}で囲む
- switch/caseは複雑な値比較を避ける
- foreach内での参照渡しは性能向上に
- final修飾子やprivateの適切使用
- 定数は大文字+アンダースコア
- 静的メソッド呼び出しはコンテナ経由
セキュリティ
$orderId = htmlspecialchars(trim($_POST['id']), ENT_QUOTES, 'UTF-8');
入力パラメータの型指定とエスケープは必須です。
データベース設計
- 論理削除はis_deleted(10=有効,99=無効)で表現
- 小数型はdecimalのみ使用
- varcharは5000文字以内(長すぎる場合はtext型に分離)
- 必須フィールド:id, created_at, updated_at
索引最適化
- 3テーブル以上のJOINは禁止
- varcharのインデックスは長さ指定必須
- order byは索引の左寄せを活用
- 区分度の高いカラムを索引左端に
その他のベストプラクティス
- try-catch-finallyの必須使用
- 変数は事前に宣言・初期化
- 多重ループは内側に頻度が高い処理
- @エラー抑制演算子の使用禁止
設計パターン
FactoryやProxyなどの設計パターンを名前から明確に示す。
interface PaymentGateway {
public function processPayment();
}
インターフェースと実装クラスの分離により柔軟性を確保します。