PSR-0(日本語)

以下、オートローダー連携のための要件を説明します。

必須要件

  • 完全な名前空間とクラス名のために下記構造としてください。\<ベンダー名>\(<名前空間>\)*<クラス名>
  • いずれの名前空間もトップレベルの名前空間である「ベンダー名」を持つ必要があります。
  • 名前空間は複数の自由な名前空間を持つことができます。
  • 名前空間の区切りは読み込まれる際に、「DIRECTORY_SEPARATOR」に変換されます。
  • クラス名に含まれるアンダースコア「_」は、「DIRECTORY_SEPARATOR」に変換されます。アンダースコアは特別な意味を持ちません。
  • 名前空間とクラス名に「.php」をつけて完全なファイルとなり読み込まれます。
  • ベンダー名、名前空間及びクラス名のアルファベット文字列における小文字・大文字の組み合わせは自由です。

  • \Doctrine\Common\IsolatedClassLoader => /path/to/project/lib/vendor/Doctrine/Common/IsolatedClassLoader.php
  • \Symfony\Core\Request => /path/to/project/lib/vendor/Symfony/Core/Request.php
  • \Zend\Acl => /path/to/project/lib/vendor/Zend/Acl.php
  • \Zend\Mail\Message => /path/to/project/lib/vendor/Zend/Mail/Message.php

名前空間及びクラス名におけるアンダースコアの扱い

  • \namespace\package\Class_Name => /path/to/project/lib/vendor/namespace/package/Class/Name.php
  • \namespace\package_name\Class_Name => /path/to/project/lib/vendor/namespace/package_name/Class/Name.php

ここでは余計な混乱を防ぐための最低限のオートローダー連携基準を示します。 下記のPHP 5.3上におけるSplClassLoader実装例により、これらの基準を確認することができます。

実装例

以下は、上記基準に従ったクラスのオートロードにおける振る舞いを確認するための例です。

<?php

function autoload($className)
{
    $className = ltrim($className, '\\');
    $fileName  = '';
    $namespace = '';
    if ($lastNsPos = strripos($className, '\\')) {
        $namespace = substr($className, 0, $lastNsPos);
        $className = substr($className, $lastNsPos + 1);
        $fileName  = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
    }
    $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';

    require $fileName;
}

SplClassLoader実装について

以下のgistで、上記のオートローダー互換運用を満たした上で実装クラスがロードされるというSplClassLoaderの簡単な実装例を示します。 基準を満たしたうえで、PHP 5.3クラスをロードするための推奨方法となります。