読者です 読者をやめる 読者になる 読者になる

恥知らずのウェブエンジニア -web engineer, shameless

これは一歩を踏み出すことができない者たちのブログ

PSR-4(Autoloading Standard)を見ていく

要約ですので、所々省いている箇所あります。

オリジナルはこちら

www.php-fig.org

概要

  • ファイルパスからクラスをautoloadingする仕様
  • PSR-0も含め、その他のautoloadingの仕様と相互運用可能
  • このPSRはautoloadingされるためのファイルを配置する場所も記述している

仕様

  1. classはクラス、インターフェース、トレイトなどの構造を指す
  2. 完全修飾クラス名は下記の形式 \<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>
    1. 完全修飾クラス名は、vendor namespaceで知られるトップレベルのネームスペースを持っていないといけません
    2. 完全修飾クラス名は、1つ以上のサブネームスペースを持ってもよい
    3. 完全修飾クラス名は、最後にクラス名をもたないといけない
    4. アンダースコアは完全修飾クラス名の中で特別な意味を持ちません
    5. 完全修飾クラス名は大文字/小文字組み合わせてもよい
    6. すべてのクラス名は大文字/小文字区別します
  3. 完全修飾クラス名に対応するクラス名をロードする時は、
    1. 完全修飾クラス名の先頭のネームスペースとサブネームスペース(ネームスペースプリフィックス)がベースディレクトリに対応します
    2. ネームスペースプリフィックス以後のサブネームスペースはベースディレクトリ内のサブディレクトリに対応します。ネームスペースのセパレータはディレクトリのセパレータに対応します。サブディレクトリ名はサブネームスペース名に大文字小文字含め対応しないといけない
    3. 最後のクラス名は.phpで終わるファイル名に対応します。ファイル名は大文字小文字含め最後のクラス名に対応していないといけません
  4. オートローダーの実装ではexceptionsをthrowしてはいけない。どのレベルのエラーも出してはいけない。戻り値も返すべきではありません

Examples

FULLY QUALIFIED CLASS NAME NAMESPACE PREFIX BASE DIRECTORY RESULTING FILE PATH
\Acme\Log\Writer\File_Writer Acme\Log\Writer ./acme-log-writer/lib/ ./acme-log-writer/lib/File_Writer.php
\Aura\Web\Response\Status Aura\Web /path/to/aura-web/src/ /path/to/aura-web/src/Response/Status.php
\Symfony\Core\Request Symfony\Core ./vendor/Symfony/Core/ ./vendor/Symfony/Core/Request.php
\Zend\Acl Zend /usr/includes/Zend/ /usr/includes/Zend/Acl.php
  • PSR4を実装したクラス例

Example Implementations of PSR-4 - PHP-FIG

  • cakephpは↑のをほぼそのまま使っている模様

cakephp/ClassLoader.php at master · cakephp/cakephp · GitHub

  • Codeigniter4のPSR4を実装したAutoloader

CodeIgniter4/Autoloader.php at develop · bcit-ci/CodeIgniter4 · GitHub


その昔PEARなどはライブラリを中央ディレクトリにイントールして使用していましたが、composerの登場により各プロジェクトごとにパッケージとして使うようになりました。
また名前空間のなかった時代の名残としてクラス名に'_‘で区切って擬似的に名前空間を作っていたり煩雑になったのを共通化しようよって感じかと!

PSR-5(PHPDoc Standard)はDRAFTなので、次はPSR-6(Caching Interface)へ・・・

PSR-6: # Introduction - PHP-FIG