PSR-0(オートローディング規格)の日本語訳と解説

PSRって0/1/2あたりはよく日本語化されていたのを見てたんですが、その後で決められたPSRが日本語化されてるのってみたことないですね。あんま需要ないんですかね。

改めて自分のPHPと英語の勉強用に日本語訳をしてみようと思い立ったのでやってみます。まずはPSR-0から。

原文と日本語訳は下記になります。

Autoloading Standard:オートローディング規格

[原文]

Deprecated – As of 2014-10-21 PSR-0 has been marked as deprecated. PSR-4 is now recommended as an alternative.

[日本語訳]

廃止予定 – 2014年10月21日現在、PSR-0は廃止予定となりました、 代わりに現在はPSR-4が推奨されいています。

いきなりですが、廃止予定らしいです。後でも出てくる、アンダースコアのディレクトリ区切り文字への変換って、名前空間をサポートしないPHP5.2以前のバージョン対策っぽいですからね。

[原文]

The following describes the mandatory requirements that must be adhered to for autoloader interoperability.

[日本語訳]

次にオートローダーの相互運用性を保つために守らなければならない必須要件について説明します。

相互運用性というのは、プロジェクト間での互換性ということですね。この規約を守って作ったオートローダーは別のプロジェクトに持っていってもそのまま使えるようになりますよ、というのがオートローディング規約の目的です。

Mandatory:必須要件

[原文]
  • A fully-qualified namespace and class must have the following structure \<Vendor Name>\(<Namespace>\)*<Class Name>
  • Each namespace must have a top-level namespace (“Vendor Name”).
  • Each namespace can have as many sub-namespaces as it wishes.
  • Each namespace separator is converted to a DIRECTORY_SEPARATOR when loading from the file system.
  • Each _ character in the CLASS NAME is converted to a DIRECTORY_SEPARATOR. The _ character has no special meaning in the namespace.
  • The fully-qualified namespace and class are suffixed with .php when loading from the file system.
  • Alphabetic characters in vendor names, namespaces, and class names may be of any combination of lower case and upper case.
[日本語訳]
  • 完全修飾名前空間とクラス名は次の構造を持たなければなりません。 \<Vendor Name>\(<Namespace>\)*<Class Name>
  • どの名前空間もトップレベルに「ベンダー名」を持たなければなりません。
  • どの名前空間も好きな数だけサブ名前空間を持つことが出来ます。
  • 名前空間の区切り文字はファイルシステムからロードする際にDIRECTORY_SEPARATOR(ディレクトリの区切り文字)に変換されます。
  • クラス名に含まれる_(アンダースコア)は、DIRECTORY_SEPARATORに変換されます。名前空間に含まれる_は特別な意味を持ちません。
  • 完全修飾名前空間とクラス名はファイルシステムからロードする際に.phpが最後に付け加えられます。
  • ベンダー名・名前空間・クラス名は、大文字・小文字の組み合わせのアルファベットが使用できます。

ここも、訳そのまんまですね。オートローダーの仕組みとしては名前空間の区切り文字とクラス名のアンダーバーをディレクトリの区切り文字(DIRECTORY_SEPARATOR)に変換して、最後に.phpをくっつけたファイルを読み込もうとするということです。

そのあたりは次の例を見たほうが早いです。

Examples:例

[原文]
  • \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

必須要件通りの変換の例です。どのクラスも/path/to/project/lib/vendorからの相対パスとして扱われているのは「include_path」に追加されているからと解釈しましょう。

Underscores in Namespaces and Class Names:名前空間とクラス名のアンダースコアの例

[原文]
  • \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

これも必須要件通りですね。クラス名の_(アンダースコア)は、DIRECTORY_SEPARATORに変換されますが、名前空間に含まれる_は変換されないという具体的な例です。

[原文]

The standards we set here should be the lowest common denominator for painless autoloader interoperability. following these standards by utilizing this sample SplClassLoader implementation which is able to load PHP 5.3 classes.

[日本語訳]

ここで定めた規格は、オートローダーの相互運用性を実現する最も簡単な方法になるはずです。 下記にPHP5.3クラスがロードできる、この規格に準拠したクラスローダーの実装サンプルを紹介します。

「lowest common denominator」は直訳だと「最小公分母」になり日本語にするとあまり伝わらないので、「painless」と合わせて「最も簡単な方法」と意訳しました。 あと、英文には「SplClassLoader」とありますが、これはこの後のサンプルで実装しているクラスにただ単につけられた名前の様なので、「クラスローダー」と訳しました。

Example Implementation:実装例

[原文]

Below is an example function to simply demonstrate how the above proposed standards are autoloaded.

[日本語訳]

下記は、上記で提案した規格のオートロード方法を示した簡単なデモ関数です。

「demonstrate」単純にデモとして「function to simply demonstrate」をまるっと「簡単なデモ関数」と訳しました。

[原文]
<?php

function autoload($className)
{
    $className = ltrim($className, '\\');
    $fileName  = '';
    $namespace = '';
    if ($lastNsPos = strrpos($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;
}
spl_autoload_register('autoload');

名前空間の区切り文字と、クラス名の区切り文字をディレクトリの区切り文字に変換して、「.php」をつけたものをロードしているのがわかります。

SplClassLoader Implementation:SplClassLoaderの実装

[原文]

The following gist is a sample SplClassLoader implementation that can load your classes if you follow the autoloader interoperability standards proposed above. It is the current recommended way to load PHP 5.3 classes that follow these standards.

[日本語訳]

次のgistはこのオートローディング規格に準拠したクラスがロードできるクラスローダー(SplClassLoader)の実装例です。 規格に準拠するPHP5.3のクラスをロードする現時点での推奨方法です。

「autoloader interoperability standards proposed above」はそのまま訳すと「上記で提案されたオートローダーの相互運用性の規格」となりますが、「オートローディング規格」で十分伝わると思ったので、そのように訳しています。

ちなみにgistはこちら → http://gist.github.com/221634

コメントを残す