Knowledge Center
技術情報などを公開しています
en ja zh

PHP コーディング規約

By Author
本ページでは標準的なPHPコーディング規約を公開します。それぞれのプロジェクトに合わせて自由に改変してご利用可能です。

1. 概要

このドキュメントは、PHPコードの一貫性と可読性を保つための標準的なコーディング規約を定めます。PSR-1、PSR-2、PSR-12を基本とし、実践的な追加ルールを含みます。

2. ファイル構造

2.1 基本ルール

2.2 PHPタグ

<?php    
// 正しい:完全な開始タグを使用    
    
<?    
// 間違い:短縮タグは使用しない    

3. 命名規則

3.1 クラス名

class UserController    
class DatabaseConnection    

3.2 メソッド名・関数名

public function getUserById($id)    
function calculateTotalPrice()    

3.3 変数名

$userName = 'John';    
$totalAmount = 1000;    

3.4 定数

const MAX_RETRY_COUNT = 3;    
define('API_VERSION', '1.0');    

3.5 プロパティ

public $firstName;    
private $connectionStatus;    
protected $configOptions;    

4. インデントと空白

4.1 インデント

4.2 行の長さ

4.3 空白行

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 プロパティとメソッドの順序

  1. 定数
  2. プロパティ(public → protected → private)
  3. コンストラクタ
  4. パブリックメソッド
  5. プロテクテッドメソッド
  6. プライベートメソッド

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');    

おすすめの記事