クラスのオートロード

公開日: : 最終更新日:2019/12/01 php

通常クラスを読み込む際は、require_onceと書いて制御しますが、
PSR0に準拠した書き方をするとうまい具合にAutoLoad出来るように構築できます。

PSR0とは

PEAR、Zendなど色々なコーディング規約があるとお思いますが、どれを使えばいいか全く判りません。
そこで、統一のコーディング規約を準備しようということで作られたのがPSRです。

PRSは0から3まで存在し、数字が大きくなると厳しい規約になってきます。
AutoLoadに必要なのはPSR0ですので、PSR0を詳しく掘り下げていきます。

PSR-0(日本語)

完全な名前空間とクラス名のために下記構造としてください。\<ベンダー名>\(<名前空間>\)*<クラス名>

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

・・・うん、わかりづらいのでhttps://github.com/aws/aws-sdk-php/blob/master/src/Aws/S3/Model/MultipartUpload/AbstractTransfer.phpを参考に説明していきます。

いずれの名前空間もトップレベルの名前空間である「ベンダー名」を持つ必要があります。

ベンダー名とは、簡単に言うとライブラリの名称みたいなものです。
AWS SDKでは「Aws」に当たる部分になります。

//Awsと付いている部分
namespace Aws\S3\Model\MultipartUpload;

名前空間は複数の自由な名前空間を持つことができます。

これはベンダー名以降の名称になります。(最後はクラス名です。)

/**
 * \S3\Modelと付いている部分。
 * ここはいくつでも増やすことが出来る。
 */
namespace Aws\S3\Model\MultipartUpload;

名前空間の区切りは読み込まれる際に、「DIRECTORY_SEPARATOR」に変換されます。

これはファイル読み込みの際にnamespaseを元にファイルパスを取得するって意味です。

/**
 * これの場合は Aws/S3/Model/MultipartUpload
 * のような形に変換して読み込むようになる。
 */
namespace Aws\S3\Model\MultipartUpload;

クラス名に含まれるアンダースコア「_」は、「DIRECTORY_SEPARATOR」に変換されます。アンダースコアは特別な意味を持ちません。

サンプル見たほうが早いですね。

/**
 * もしこのようなnamespaceが存在した場合
 * Aws/S3/Model/Multipart/Upload
 * のような形に変換して読み込むようになる。
 */
namespace Aws\S3\Model\Multipart_Upload;

名前空間とクラス名に「.php」をつけて完全なファイルとなり読み込まれます。

// Aws/S3/Model/MultipartUpload.phpとして呼ばれます。
namespace Aws\S3\Model\MultipartUpload;

ベンダー名、名前空間及びクラス名のアルファベット文字列における小文字・大文字の組み合わせは自由です。

これは説明するまでもないですね。

上記のようにファイルのパスと、namespaceは密接に絡んでいる形になります。

AutoLoad

実は自分で実装した奴があるのですが、既に実装された奴があり、そちらのほうがコードがキレイですのでリンクだけ貼り付けておきます。
https://gist.github.com/jwage/221634

まとめ

composerなどもPSRに準拠した形で作成するようになってきており、全てがPSRに統一される方向性になってきています。
非常に素晴らしいことです。規約が統一されれば他人のコードを読んでも、ある程度予測が付くようになります。
しかし、規約が厳しくなればなるほど、動的型付け言語の特徴でもあるダックタイピングなどの柔軟性が失われていきそうな気もします。。。
PSR0から3まで準備されているのも、PHPの柔軟性を失わないための考慮かもしれません。

関連記事

記事はありませんでした

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

PAGE TOP ↑