PHPのコーディング規則、PSRを学ぶ(2)の続きです。
今回はPSR-0, 1, 2を日本語に翻訳してみましたさんのPSR-0(日本語)を読んでみます。
1.本文の冒頭を読んでみる
必須要件
2.冒頭を読んでみて考えてみる
疑問点1:「ベンダー名って何?」
IT業界では、ハードウェアや・ソフトウェアの供給元企業を「ITベンダー」と呼ぶ。対義語は「ユーザー企業」。(Wikipediaより)
つまり、個人製作の場合「自分の名前またはサイト名」をベンダー名として付ければいいのか。
なぜこういうことをするのか?を考えてみると・・・
PHPは同じ名前の関数やクラス名を指定すると「二重定義」でエラーが出ます。その防止策でしょう。これが「名前空間の汚染」防止なのかもしれません。
疑問点2:「名前空間って何?」
見た感じ、機能の名前を付けていい感じですね。
もう少し読み進めてみると・・・
例
\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
なるほど!
「\Zend\Mail\Message」のクラス名を分解してみると、
「Zend」という製品の
「Mail」機構の
「Message」機能
というわけですね。
それを、「~/Zend/Mail/Message.php」から読み込むようにしなさいと。
それなら誰でもどこから読んでいるか理解できるし。
あと、「\Zend\Acl」のように機構を分けなくてもいいくらい短ければ、「~/Zend/Acl.php」から読み込むようにしなさいと。
疑問点3:「DIRECTORY_SEPARATORって何?」
直訳すると「DIRECTORY_SEPARATOR」=ディレクトリの区切り・・・これでなんとなくわかったような気がします。
さらに少し読み進めてみると、
名前空間及びクラス名におけるアンダースコアの扱い
\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
つまり、
・「\<ベンダー名>\(<名前空間>\)*<クラス名>」の構成で、ディレクトリが区切られる
・クラス名のアンダースコア「_」はディレクトリの区切りになる
・名前空間の中のアンダースコア「_」はディレクトリの区切りにはならない
3つのことが示されているわけですね!
私のサイトとこの記事で言い換えると、「\Rei-Farms(ベンダー名)\BLOG(名前空間)\Web製作_PSRの説明(クラス名)」とクラス名を設定して、ファイルは「/Rei-Farms/BLOG/Web製作/PSRの説明」にあると。
それだったら他人のコードを読んでいても混乱する可能性が非常に低くなりますね。
3.最後まで読み進めてみる
実装例
以下は、上記基準に従ったクラスのオートロードにおける振る舞いを確認するための例です。
SplClassLoader実装について
以下のgistで、上記のオートローダー互換運用を満たした上で実装クラスがロードされるというSplClassLoaderの簡単な実装例を示します。 基準を満たしたうえで、PHP 5.3クラスをロードするための推奨方法となります。
http://gist.github.com/221634
「これまでの基準(上記)に適合したクラス設定をしても大丈夫な”クラス名ローダー”を作ってね」というわけですね。
「http://gist.github.com/221634」に推奨の方法があるよとも書かれています。
4.「http://gist.github.com/221634」にアクセスする
OK!英語だ!/(^o^)\
英語が苦手だとどうしても読むのをためらいますよね。
ですが、重要なことは先頭付近に書いてあることが多いです。
重要そうなところを抜粋してみます。
直訳
“Doctrine Commonパッケージ”の”Doctrine\Commone”のクラスをロードする例。
$classLoader = new SplClassLoader(‘Doctrine\Common’, ‘/path/to/doctrine’);
$classLoader->register();
上記のように、このSplClassLoader.phpのクラスSplClassLoaderを使えばこの基準通りにクラス名が設定できるというわけですね。
これは試してみるしかない!と思いましたが、そろそろ長くなってきているのでこれにて終了します。
次の記事
次は、実際に「クラス名定義を自宅サーバーで試してみる」を行います。
PHPのコーディング規則、PSRを学ぶ(4)へ
参考
PHPのコーディング規約 PSR-0、PSR-1、PSR-2、PSR-3とは
PSR-0 を和訳してみた
5分で分かる名前空間とオートロード