PSR-4 オートロード規格
CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 12/91。
PSR-4は、名前空間とファイルの場所に基づいてPHPクラスを自動的にロードする方法を定義する標準です。各クラスファイルを個別に手動でインクルードする代わりに、PSR-4を使用すると、クラスを使用する際にPHPが自動的にクラスを見つけてロードできるようになります。
基本的なルールは単純です。名前空間はディレクトリ構造と一致している必要があります。App\Models\User というクラスがある場合、そのファイルは App/Models/User.php に配置されている必要があります。
<?php
// ファイル: src/Models/User.php
namespace App\Models;
class User {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
PSR-4ルールに従ったシンプルなオートローダー関数を記述できます:
<?php
// ファイル: autoload.php
spl_autoload_register(function ($class) {
$prefix = 'App\\';
$baseDir = __DIR__ . '/src/';
// クラスが名前空間プレフィックスを使用しているか確認する
if (strpos($class, $prefix) === 0) {
$relativeClass = substr($class, strlen($prefix));
$file = $baseDir . str_replace('\\', '/', $relativeClass) . '.php';
if (file_exists($file)) {
require $file;
}
}
});
spl_autoload_register 関数は、未知のクラスに遭遇したときに、あなたの関数を呼び出すよう PHP に指示します。この関数は、名前空間をファイルパスに変換して読み込みます。
重要なポイント: PSR-4は、名前空間とファイルパスの間に予測可能なマッピングを作成します。App\Models\User を見れば、そのファイルが src/Models/User.php にあることがすぐにわかります。この規約により、プロジェクトのナビゲートやメンテナンスが容易になります。
チャレンジ
簡単名前空間とファイルの場所に基づいてクラスを自動的に読み込む、シンプルな PSR-4 オートローディングシステムを構築しましょう。
PSR-4 がどのように名前空間をディレクトリパスにマッピングするかを示す3つのファイルを含むプロジェクトを作成します:
src/Services/Logger.php—App\Services名前空間にLoggerクラスを定義します。このクラスには、public $nameプロパティ、名前を受け取って設定するコンストラクタ、および"[name] logged: [message]"を返すlog($message)メソッドが必要です。src/Services/Mailer.php—App\Services名前空間にMailerクラスを定義します。このクラスには、public $senderプロパティ、送信者を受け取って設定するコンストラクタ、および"Mail from [sender] to [to]"を返すsend($to)メソッドが必要です。main.php—spl_autoload_registerを使用して、App\名前空間プレフィックスをsrc/ディレクトリにマッピングする PSR-4 オートローダーを作成します。オートローダーは、名前空間の区切り文字をディレクトリの区切り文字に変換し、正しいファイルを見つけるために.phpを追加する必要があります。オートローダーを登録した後、useキーワードを使用して両方のクラスをインポートし、名前が"FileLogger"のLoggerと、送信者が"admin@site.com"のMailerを作成します。ロガーでlog("System started")を呼び出した結果と、メーラーでsend("user@example.com")を呼び出した結果を(それぞれ個別の行に)出力してください。
重要なポイントは、オートローダー関数が完全修飾クラス名(App\Services\Logger など)を受け取り、それをファイルパス(src/Services/Logger.php)に変換する必要があるということです。strpos を使用してクラスが名前空間プレフィックスで始まっているかを確認し、substr で相対クラス名を取得し、str_replace でバックスラッシュをスラッシュに変換します。
チートシート
PSR-4は、PHPのクラスを名前空間とファイルの場所に基づいて自動的にロードする方法を定義する標準規格です。名前空間はディレクトリ構造と一致している必要があります。
クラス構造の例:
<?php
// File: src/Models/User.php
namespace App\Models;
class User {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
spl_autoload_registerを使用したPSR-4オートローダー:
<?php
spl_autoload_register(function ($class) {
$prefix = 'App\\';
$baseDir = __DIR__ . '/src/';
// Check if class uses our namespace prefix
if (strpos($class, $prefix) === 0) {
$relativeClass = substr($class, strlen($prefix));
$file = $baseDir . str_replace('\\', '/', $relativeClass) . '.php';
if (file_exists($file)) {
require $file;
}
}
});
オートローダーは、名前空間の区切り文字(\)をディレクトリの区切り文字(/)に変換し、正しいファイルを見つけるために.phpを追加します。例えば、App\Models\Userはsrc/Models/User.phpにマッピングされます。
自分で試してみよう
<?php
// PSR-4 オートローダーの実装
// TODO: spl_autoload_register を使用してオートローダーを登録する
// オートローダーの動作:
// 1. クラス名が 'App\' 名前空間プレフィックスで始まっているか確認する
// 2. 'App\' プレフィックスを削除して相対クラス名を取得する
// 3. 名前空間の区切り文字 (\) をディレクトリの区切り文字 (/) に変換する
// 4. 先頭に 'src/' を、末尾に '.php' を追加してファイルパスを作成する
// 5. ファイルが存在する場合は require する
spl_autoload_register(function ($class) {
// TODO: 名前空間プレフィックスとベースディレクトリを定義する
// TODO: クラスが名前空間プレフィックスを使用しているか確認する (strpos を使用)
// TODO: 相対クラス名を取得する (substr を使用)
// TODO: \ を / に置換してファイルパスを作成する (str_replace を使用)
// TODO: ファイルが存在する場合は require する
});
// TODO: 'use' キーワードを使用して Logger クラスと Mailer クラスをインポートする
// TODO: 名前 "FileLogger" で Logger インスタンスを作成する
// TODO: 送信者 "admin@site.com" で Mailer インスタンスを作成する
// TODO: log("System started") の結果を出力する
// TODO: send("user@example.com") の結果を出力する
?>このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。