■ PHP:autoloaderを使う 1

PHPで外部ファイルを使用する場合は require_once で読み込む必要があるが、
autoloaderというのを使えば自動的に読み込まれるらしいので調べてみる。


PSRとは?

PHPには PSR (PHP Standards Recommendations) という PHP-FIG (PHP Framework Interop Group) が策定しているコーディング規約がある。
この PSR には、PSR-0 ~ PSR-19 までの番号があり、それぞれに規約がまとめられている。
※ 参考:https://www.php-fig.org/psr/

この中で autoloader に関するものは、
・PSR-0 (Autoloading Standard)
・PSR-4 (Autoloading Standard)
ただし PSR-0 は DEPRECATED(非推薦) なので、PSR-4 が対象である。

完全修飾クラス名

クラスは "A fully qualified class name" (完全修飾クラス名) の名前を持つ。
完全修飾クラス名は以下の形式である。
\<(1)Namespacename>(\<(2)SubNamespaces>)*\<(3)ClassName>

(1)Namespaceは、ベンダー名など。
(2)SubNamespacesは、1つ以上の任意のサブ名前空間
(3)ClassNameは、クラス名

適当な名前で例を作ると "\TestCorp\ManageSytem\Log\Writer" といった感じになる。
末尾の"Writer"がクラス名。
クラス名が必要なので、autoloaderで使えるのは クラス(他にはInterfaceやTrait)となる。
先ほどの完全修飾クラス名の例を実際のPHPファイルで表すと、以下のようになる。
namespace TestCorp\ManageSystem\Log;

class Writer {
  public static function debug(string $message) {
    :
  }
  :
}

ソースファイルの格納

先ほどの例をクラスファイルを保存する場合、完全修飾クラス名をファイルシステムのパス名として保存すれば良い。
保存先のルートフォルダを "ベースディレクトリ" (例えば D:\www\htdocs) とし、
(1)Namespace または、(1)Namespace + (2)SubNamespaces のいくつか を "ベースディレクトリ" と対応させる。

例えば ベースディレクトリを "D:\www\htdocs"、対応する名前空間を "\TestCorp\ManageSystem"とし、
またPHPソースのルートパスも "D:\www\htdocs" とする。
この場合、\TestCorp\ManageSystem\Log\Writer クラスのファイル名は "D:\www\htdocs\Log\Writer.php" となる。

また、index.php 以外はすべて include フォルダに纏めて格納している・・・といった場合は、ベースディレクトリは "D:\www\htdocs\include" とする。
この場合、\TestCorp\ManageSystem\Log\Writer クラスのファイル名は "D:\www\htdocs\include\Log\Writer.php" となる。

クラスの呼び出し側

先ほどの例のクラスを使用する場合
namespace TestCorp\ManageSystem;

Log\Write::debug("デバッグ");
 :
のように普通に使えば良い。

次回記事:PHP:autoloaderを使う 2


PHP, PSR-4

0 件のコメント:

その他の記事