PHPのコーディング規則、PSRを学ぶ(3)

公開日: : 最終更新日:2013/11/23 Web制作

PHPのコーディング規則、PSRを学ぶ(2)の続きです。
今回はPSR-0, 1, 2を日本語に翻訳してみましたさんのPSR-0(日本語)を読んでみます。

1.本文の冒頭を読んでみる

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

必須要件

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

  • 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」に変換されます。
  • クラス名に含まれるアンダースコア「_」は、「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.最後まで読み進めてみる

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

    実装例

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

    SplClassLoader実装について

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

    「これまでの基準(上記)に適合したクラス設定をしても大丈夫な”クラス名ローダー”を作ってね」というわけですね。

    http://gist.github.com/221634」に推奨の方法があるよとも書かれています。

    4.「http://gist.github.com/221634」にアクセスする

    Loader
    OK!英語だ!/(^o^)\
    英語が苦手だとどうしても読むのをためらいますよね。
    ですが、重要なことは先頭付近に書いてあることが多いです。

    重要そうなところを抜粋してみます。
    直訳
    “Doctrine Commonパッケージ”の”Doctrine\Commone”のクラスをロードする例。

    // Example which loads classes for the Doctrine Common package in the Doctrine\Common namespace.
    $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分で分かる名前空間とオートロード

    Twitter(@R_farms)でブログの更新情報をお伝えしています。
    フォローしていただけると嬉しいです!

    このカテゴリの記事

    PHPのコーディング規則、PSRを学ぶ(2)

    PHPのコーディング規則、PSRを学ぶ(1)の続きです。 今回は基本中の基本、文字コードと改行コー

    記事を読む

    現代PHPの正しい道「PHP: The Right Way」の紹介とその要約

    時代遅れの本や情報があふれている。そのため「何年前のコレ?」というコードが広まっている。 私も

    記事を読む

    ミニ四駆ブログまとめ RSS読み込み速度の改善

    更新時、非常に重い思いをしていたRSS読み込み速度が改善されました。 読み込み時間が約1/3くらい

    記事を読む

    まとめ読み バージョン1.1.1のリリース

    フリーソフト「まとめ読み」バージョン1.1.1のリリースを行いました。 まとめ読み ダウンロー

    記事を読む

    知らなかった!「while」と「do while」の違い

    Perl→PHPを独学でやって現在C言語をやってます。 「do{ ~ }while( ~ );

    記事を読む

    PHPのコーディング規則、PSRのまとめ

    「PHPのコーディング規則、PSRを学ぶ」(1)~(5)の集大成が完成しました。 PHPコ

    記事を読む

    iPhoneアプリを開発してみよう

    最近ずっとiPhoneアプリで遊んでて、 「なんか頭使うゲームないな?」と思い("本質的には育成ゲ

    記事を読む

    C言語およびC++のコンパイラMinGWのインストールとテスト

    Windows環境でCとC++を開発するためのコンパイラ「MinGW」のインストールを行います。

    記事を読む

    独自ドメイン取得

    ねんがんの どくじどめいんを しゅとくしたぞ!( ^^) 「http://rei-farms.

    記事を読む

    PHPのコーディング規則、PSRを学ぶ(5)

    PHPのコーディング規則、PSRを学ぶ(4)の続きです。 この記事では、PHPのコーディング規則P

    記事を読む

    swiftでゲームプログラミング(開始前)

    iPhoneアプリを開発するために必要な言語「Swift」 そう

    黒い砂漠 KN覚醒スキル特化考察(17/07/01)

    【現状】 Lv61になったので、PvPでアサシンっぽいことできるよう

    iPhoneアプリを開発してみよう

    最近ずっとiPhoneアプリで遊んでて、 「なんか頭使うゲームないな

    黒い砂漠 KNスキル考察(17/07/23)

    黒い砂漠のメインでプレイしているクノイチ(略:KN)のスキルについて考

    生きていますよっと

    お久しぶりでございます。 だいぶ放置したので見てる人いないかなー

    →もっと見る

    PAGE TOP ↑