hnwの日記

PSR-0 を和訳してみた

先週の土日にPHPMatsuriに行ってきました。ナイスなイベントでしたね。その感想はまた改めて書きますが、Nate Abeleによるセッション「Practical PHP 5.3」で触れられていたPSR-0を適当に訳してみました。これはPHP5.3の名前空間とクラス名に関する標準化の試みで、少なくともZendFrameworkとsymfonyの中の人が関わっているようです。


うまく訳出できなくて苦し紛れのところもあるので、修正すべき箇所があれば教えてください。


元の文章は http://groups.google.com/group/php-standards/web/psr-0-final-proposal にあります。以下はその和訳です。

PSR-0 最終提案

以下で、オートローダーの相互利用性を確保するための必須要件について記述します。

必須要件:
  • 名前空間とクラスの完全な名前として、次のような構造を持たせてください。 \<ベンダー名>\(<名前空間>\)*<クラス名>
  • どの名前空間も、トップレベルの名前空間として「ベンダー名」を持つ必要があります。
  • どの名前空間も、第二レベル以下については好きなように使うことができます。
  • 名前空間の区切り文字(訳注:つまりバックスラッシュ1文字)は、ファイルシステムからロードする際にはDIRECTORY_SEPARATORに変換されます。
  • クラス名に含まれるアンダースコア文字はDIRECTORY_SEPARATORに置換されます(訳注:当然、ロードの際の話題でしょう。PEARなどの命名規則に基づいた、後方互換性のための仕様だと考えられます)。名前空間に含まれるアンダースコア文字は特別な意味を持っていません。
  • ファイルシステムからロードする際、名前空間とクラスの完全な名前の後ろに「.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の実装例で、上記で提案したオートローダーの相互利用性に関する標準に従っているクラスをロードすることができます。これは、この標準に従っているPHP5.3のクラスをロードする方法として現時点で推奨されているものです。


http://gist.github.com/221634

訳者による補足

SplClassLoaderというクラス名を見て、これがSPLの一部としてPHPに含まれていると勘違いしてしまうかもしれませんが、少なくともPHP5.3.3時点ではPHP本体に含まれていません。SPL関数と密接に関わっているからこのように命名しただけで、PHP本体に入れるつもりは無さそうな気がします。


SplClassLoaderをextensionで実装してベンチマークしている記事も見つけましたが、現実的なPHPプログラムに対する実行性能の向上はごく小さいのではないでしょうか。