PHP入門 オブジェクト指向 クラスの自動ローディング

クラスは複数のスクリプトから再利用するというその性質上、1クラスを1ファイルで管理すべきです。1クラス1ファイルなら無駄なクラスを読み込む必要もなく、ファイル管理という観点からも整理しやすくなります。ただ、1クラス1ファイル方式で作成していくと、扱うクラスが増えてきた場合、クラスファイル1つ1つをrequire_once命令を呼び出さなくてはなりません。

spl_autoload_register関数

そこで役立つのがspl_autoload_register関数です。

<?php
spl_autoload_register(function(string $name):void{
  require_once "{$name}.php";
});

apl_autoload_register関数は、オートローダーを登録するための関数です。オートローダー(autoloader)とは、存在しないクラスをインスタンス化する際に呼び出され、対応するクラスファイルをインクルードするための仕組みです。

構文:use命令

apl_autoload_register([callback $autoload_function [, bool $throw = true[, bool $prepend - [alse]]]):bool
$autoload_functionクラスファイルをロードするための関数
$throw$autoloadの登録に失敗した場合に例外を返すか
$prepend$autoloadをキューの先頭に追加するか(既定では末尾)

オートローダーには、呼び出そうとしたクラスの名前が引数として渡されます。一般的には「クラス名.php」「クラス名.class.php」のように、ファイル名に一定の規則を設けたうえで、オートローダーの中でrequire_once命令を呼び出すという使い方をします。これによって、クラスが呼び出されたタイミングで、自動的に同名のクラスファイルをインクルードできるわけです。

<?php
require_once 'Autoloader.php';
$p = new Person('太郎','山田');
$p->show();

上記では、Person.phpはインクルードされていないのに、Personクラスがインスタンス化できていることが確認できます。このようにspl_autoload_register関数を利用すると、クラスごとにrequire_once命令を呼び出す必要がなくなります。

spl_autoload_register関数の自動呼び出し

クラスのオートローディングを行うAutoloader.phpは、アプリケーションは以下のPHPスクリプトから共通して呼び出されることを想定したファイルです。外部ファイルをインクルードする方法として、これまではrequire_once命令を利用してきましたが、このような共通ファイルを呼び出すために、すべての.phpファイルにrequire_once命令を記述するのは大変です。そこで登場するのが、php.iniのauto_prepend_fileパラメーターです。php.iniに、以下のコードを記述することで、すべてのスクリプトを実行するに先立って、Autoloader.phpを自動的に呼び出し実行できます。

auto_prepend_file = Autoloader.php

これでも問題はあります。php.iniに設定したパラメータは、サーバー上のすべてのアプリケーションに対して同じように適用されてしまいます。このようなケースでは.htaccessに記述します。.htaccessはApache標準の設定ファイルで、ドキュメントルート配下の任意のフォルダーに配置することで該当するフォルダーとそのサブフォルダーに対してのみパラメータを適用できます。

.htaccess

<IfModule mod_php.c>
  php_value auto_prepend_file "Autoloader.php"
</IfModule>

構文:.htaccessでのパラメータ設定

<IfModule mod_php.c>
  php_value パラメータ名 パラメータ値
  php_flag パラメータ名 on|off
</IfModule>

.htaccessで設定可能なパラメータ

.htaccessでは、php.iniのすべてのパラメーターを設定できるわけではありません。パラメーターによっては、php.iniでしか設定できないものがあります。どのパラメーターが.htaccessで設定可能かは次のコードで確認します。

print_r(ini_get_all());

アクセスレベル([access]の値)が6,7である場合、そのパラメーターは.htaccessで設定可能です。

Composerによる自動ローディングの実装

Autoloader.phpは、実はComposerライブラリを自動ロードするだけではありません。composer.jsonを編集することで、自前のクラスを自動ロードすることも可能です。

composer.json

{
   ・・・中略・・・
   "autoload": {
     "psr-4":{
        "kc\\test":"lib/kc/test"
      }
   }
}

autoload-psr4キーの配下に「名前空間:保存フォルダーのパス」の形式で表します。この例であれば「kc\test名前空間のクラスはアプリルート配下のlib/kc/testフォルダーに格納されている」ことを意味するわけです。

以下のコマンドでオートローダーを自動生成します。

>composer dump-autoload
Generating autoload files
Generated autoload files