PSR-4 Autoloading標準
CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 12/91。
PSR-4は、namespaceとfileの場所に基づいてPHP classesを自動的に読み込む方法を定義する標準です。各classのfileを手動で読み込む代わりに、PSR-4を使うと、使用時にPHPがclassesを自動的に見つけて読み込めます。
基本ルールはシンプルです。namespace は directory 構造と一致していなければなりません。class App\Models\User がある場合、file は 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のルールに従うシンプルなautoloader functionを記述できます:
<?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 function は、未知の class に遭遇するたびに PHP にあなたの function を呼び出させます。function は namespace を file path に変換して読み込みます。
重要なポイント: PSR-4 は、namespace とファイルパスの間に予測可能な対応関係を作ります。App\Models\User を見れば、ファイルが src/Models/User.php にあることがすぐに分かります。この規約により、プロジェクトのナビゲーションと保守が容易になります。
チャレンジ
簡単namespace と file の location に基づいて classes を自動的に読み込む、シンプルな PSR-4 autoloading system を構築しましょう。
PSR-4 が namespace を directory paths にマッピングする方法を示す、3つの file で構成された project を作成します。
src/Services/Logger.php:App\Servicesnamespace にLoggerclass を Define します。public $nameproperty、name を accepts して設定する constructor、および"[name] logged: [message]"を返すlog($message)method を持つ必要があります。src/Services/Mailer.php:App\Servicesnamespace にMailerclass を Define します。public $senderproperty、sender を accepts して設定する constructor、および"Mail from [sender] to [to]"を返すsend($to)method を持つ必要があります。main.php:spl_autoload_registerを使用して PSR-4 autoloader を Create し、App\namespace prefix をsrc/directory にマッピングします。autoloader は namespace separators を directory separators に Convert し、正しい file を見つけるために.phpを append する必要があります。autoloader を登録した後、usekeyword を使用して両方の classes を import し、name"FileLogger"のLoggerと sender"admin@site.com"のMailerを Create します。logger に対してlog("System started")を、mailer に対してsend("user@example.com")を呼び出した結果を Print します(それぞれ独自の行に出力します)。
重要なポイントは、autoloader function が完全修飾された class name(App\Services\Logger のようなもの)を受け取り、それを file path(src/Services/Logger.php)に Convert する必要があることです。strpos を使用して class が namespace prefix で始まるかを確認し、substr で relative class name を取得し、str_replace で backslashes を forward slashes に Convert します。
自分で試してみよう
<?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") の結果を出力する
?>このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: PHPオンラインコンパイラ