Hatena::ブログ(Diary)

hnwの日記 このページをアンテナに追加 RSSフィード

[プロフィール]
 | 

2010年10月6日(水) 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 最終提案

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


必須要件:

例:
  • \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プログラムに対する実行性能の向上はごく小さいのではないでしょうか。

 | 
ページビュー
1948352