ラベル PSR-4 の投稿を表示しています。 すべての投稿を表示
ラベル PSR-4 の投稿を表示しています。 すべての投稿を表示

■ PHP:autoloaderを使う 2

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


Composerのインストール

autloadを使うにはComposerを使うのが便利である。
ということで、まずは Composer のインストールを行う。
※ 手順:Composer:インストール

composer.jsonの作成

PHPソースのルートフォルダに composer.json ファイルを新規作成する。
既にComposerを使っていてcomposer.jsonが存在する場合は "autoload" の所を追記する。
"Namespace\\": "Path/" の行は記載例なので、実際の値で記述すること。
{
  "autoload": {
    "psr-4": {
      "Namespace\\": "Path/"
    }
  }
}
前回の例 (PHP:autoloaderを使う 1) では、
\TestCorp\ManageSystem の名前空間を D:\www\htdocs のベースディレクトリに対応させていたので、この場合の composer.json は以下の通りである。
{
  "autoload": {
    "psr-4": {
      "TestCorp\\ManageSystem\\": ""
    }
  }
}
\TestCorp\ManageSystem の名前空間を D:\www\htdocs\include のベースディレクトリに対応される場合は以下の通り。
{
  "autoload": {
    "psr-4": {
      "TestCorp\\ManageSystem\\": "include/"
    }
  }
}

autoload.phpの作成

次に Composer の autoload.php ファイルを作成する。
作成するには、コマンドプロンプトで PHPソースファイルのルート(D:\www\htdocs など)に移動し "composer dump-autoload" コマンドを実行する。
以降、composer.json の autoload設定を変更した場合は、このコマンドを実行する必要がある。

コマンドを実行すると、ルートは以下に vendor フォルダが作成され、そのフォルダ配下に "autoload.php" が作成される。
PHPソースからは、このファイルを require_once でロードすれば良い。

-- 以上 --


PHP学習, PSR-4

■ 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

その他の記事