
本ページでは標準的なPHPコーディング規約を公開します。それぞれのプロジェクトに合わせて自由に改変してご利用可能です。
1. 概要
このドキュメントは、PHPコードの一貫性と可読性を保つための標準的なコーディング規約を定めます。PSR-1、PSR-2、PSR-12を基本とし、実践的な追加ルールを含みます。
2. ファイル構造
2.1 基本ルール
- PHPコードのみを含むファイルは、閉じタグ
?>
を省略する - ファイルはUTF-8(BOMなし)でエンコードする
- 改行コードはLF(Unix形式)を使用する
- ファイル末尾には空行を1行入れる
2.2 PHPタグ
<?php
// 正しい:完全な開始タグを使用
<?
// 間違い:短縮タグは使用しない
3. 命名規則
3.1 クラス名
- PascalCase(アッパーキャメルケース)を使用
- 名詞または名詞句を使用
class UserController
class DatabaseConnection
3.2 メソッド名・関数名
- camelCase(ローワーキャメルケース)を使用
- 動詞または動詞句で始める
public function getUserById($id)
function calculateTotalPrice()
3.3 変数名
- camelCase(ローワーキャメルケース)を使用
- 意味のある名前を使用
$userName = 'John';
$totalAmount = 1000;
3.4 定数
- 大文字とアンダースコアを使用
const MAX_RETRY_COUNT = 3;
define('API_VERSION', '1.0');
3.5 プロパティ
- camelCase(ローワーキャメルケース)を使用
- privateまたはprotectedプロパティも同様
public $firstName;
private $connectionStatus;
protected $configOptions;
4. インデントと空白
4.1 インデント
- スペース4つを使用(タブは使用しない)
4.2 行の長さ
- 1行は120文字以下を推奨
- 80文字を超える場合は改行を検討
4.3 空白行
- 名前空間宣言の後に1行
- use宣言ブロックの後に1行
- クラス内のメソッド間に1行
- 論理的なコードブロック間に1行
5. 制御構造
5.1 if/elseif/else
// 波括弧は必須、同じ行に開始
if ($condition) {
// 処理
} elseif ($anotherCondition) {
// 処理
} else {
// 処理
}
5.2 switch
switch ($variable) {
case 'value1':
// 処理
break;
case 'value2':
// 処理
break;
default:
// デフォルト処理
break;
}
5.3 ループ
// for文
for ($i = 0; $i < 10; $i++) {
// 処理
}
// foreach文
foreach ($items as $key => $item) {
// 処理
}
// while文
while ($condition) {
// 処理
}
6. 関数・メソッド
6.1 宣言
// 引数リストの括弧前後にスペースなし
public function methodName($arg1, $arg2 = null)
{
// 処理
}
// 返り値の型宣言
public function getUserName(): string
{
return $this->name;
}
6.2 呼び出し
// メソッド名と括弧の間にスペースなし
$result = $object->methodName($param1, $param2);
7. クラス
7.1 基本構造
<?php
namespace App\Controllers;
use App\Models\User;
use App\Services\AuthService;
/**
* ユーザーコントローラークラス
*/
class UserController extends BaseController implements ControllerInterface
{
/**
* @var AuthService 認証サービス
*/
private $authService;
/**
* コンストラクタ
*
* @param AuthService $authService 認証サービスインスタンス
*/
public function __construct(AuthService $authService)
{
$this->authService = $authService;
}
/**
* ユーザー情報を取得
*
* @param int $userId ユーザーID
* @return User|null ユーザーオブジェクトまたはnull
*/
public function getUser(int $userId): ?User
{
// 処理
}
}
7.2 プロパティとメソッドの順序
- 定数
- プロパティ(public → protected → private)
- コンストラクタ
- パブリックメソッド
- プロテクテッドメソッド
- プライベートメソッド
8. 配列
8.1 短縮構文を使用
// 推奨
$array = [1, 2, 3];
// 非推奨
$array = array(1, 2, 3);
8.2 複数行の配列
$config = [
'host' => 'localhost',
'port' => 3306,
'username' => 'root',
'password' => 'secret',
]; // 最後の要素にもカンマを付ける
9. 文字列
9.1 引用符
- 変数展開が不要な場合はシングルクォート
- 変数展開や特殊文字が必要な場合はダブルクォート
$name = 'John';
$message = "Hello, {$name}!\n";
9.2 連結
// スペースを入れる
$fullName = $firstName . ' ' . $lastName;
10. コメント
10.1 ファイルレベルのコメント
<?php
/**
* ユーザー管理クラス
*
* @package App\Models
* @author Your Name <your.email@example.com>
* @copyright 2024 Your Company
* @license MIT License
*/
10.2 クラス・メソッドのコメント(PHPDoc)
/**
* ユーザー情報を更新する
*
* @param int $userId ユーザーID
* @param array $userData 更新するユーザーデータ
* @return bool 更新成功時true、失敗時false
* @throws \InvalidArgumentException 無効な引数の場合
*/
public function updateUser(int $userId, array $userData): bool
{
// 実装
}
10.3 インラインコメント
// 単一行コメントは処理の前に記述
$result = $this->calculate();
// 複雑な処理には説明を追加
$hash = password_hash($password, PASSWORD_DEFAULT); // bcryptアルゴリズムを使用
/*
* 複数行にわたる説明が必要な場合は
* ブロックコメントを使用
*/
11. エラーハンドリング
11.1 例外
try {
$result = $this->riskyOperation();
} catch (SpecificException $e) {
// 特定の例外を処理
$this->logger->error($e->getMessage());
} catch (\Exception $e) {
// その他の例外を処理
throw new ApplicationException('Operation failed', 0, $e);
}
11.2 エラーチェック
// 早期リターンを使用
if (!$this->isValid($data)) {
return false;
}
// メイン処理
return $this->process($data);
12. 型宣言
12.1 引数と返り値の型
// スカラー型、クラス、インターフェース、配列を明示
public function processOrder(
int $orderId,
array $items,
?Customer $customer = null
): OrderResult {
// 処理
}
12.2 プロパティの型(PHP 7.4+)
class User
{
public int $id;
public string $name;
public ?string $email = null;
private array $roles = [];
}
13. 名前空間とuse文
13.1 名前空間
<?php
namespace App\Services\User;
13.2 use文
// アルファベット順にソート
use App\Models\User;
use App\Repositories\UserRepository;
use Illuminate\Support\Collection;
use Psr\Log\LoggerInterface;
14. その他のベストプラクティス
14.1 厳密な型チェック
<?php
declare(strict_types=1);
14.2 比較演算子
// 厳密な比較を使用
if ($value === null) {
// 処理
}
// 緩い比較は避ける
if ($value == null) { // 非推奨
// 処理
}
14.3 三項演算子
// シンプルな条件の場合のみ使用
$message = $isLoggedIn ? 'Welcome' : 'Please login';
// 複雑な条件の場合はif文を使用
14.4 null合体演算子(PHP 7.0+)
// 推奨
$username = $_GET['user'] ?? 'guest';
// 非推奨
$username = isset($_GET['user']) ? $_GET['user'] : 'guest';
15. セキュリティ考慮事項
15.1 入力検証
// 常に入力を検証・サニタイズ
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
if ($email === false) {
throw new ValidationException('Invalid email address');
}
15.2 SQLインジェクション対策
// プリペアドステートメントを使用
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = :id');
$stmt->execute(['id' => $userId]);
15.3 出力エスケープ
// HTMLコンテキストでの出力
echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');