PHPでクラスをspl_autoload_registerを使ってオートロードする
PHPでインスタンスを生成する際はその対象となるクラスが実装されたファイルがあらかじめ読み込まれてなければなりません。
<?php require 'someClass.class.php'; $instance = new someClass;
ですが、生成するインスタンスが多くなるとその分たくさんrequireしないといけません。 またファイルごとにどのクラスファイルを読み込むかチェックするのも面倒です。 なので、インスタンスを生成時に必要なクラスファイルを自動で読み込む仕組み、オートロードというやり方を使います。
__autoload()について
__autoload()とは、インスタンス生成時に対象となるクラスが読み込まれていない時に呼ばれる関数 です。呼び出し時にそのクラス名を引数として与えます。__autoloadの使い方としては、その引数(=クラス名)をもとにクラスファイルを読み込むメソッドを実装するようにします。
<?php function __autoload($className) { //渡された引数(=クラス名)をもとにクラスファイルのフルパスを定義 $file = '/path/' . '/' . $className . '.php'; require $file; }
上記の様な使い方をするので、原則としてクラスファイルの作成にあたって以下の条件が要求されます。
- 一つのクラスにつきクラスファイルを作成
- クラス名とクラスファイル名は同じにする
しかし、読み込むライブラリによってクラス名とクラスファイル名の関係がばらばらだったりします。__autoload()は一つしか定義できませんが、spl_autoload_register()を使えば複数の関数を__autoload()にスタックすることが出来ます。
spl_autoload_register()について
spl_autoload_register()は__autoload()が呼ばれた時に実行する関数を定義する関数です。spl_autoload_register()を使う事で、クラス名とクラスファイル名の対応の仕方が違う複数のライブラリを使用する場合に対応できます。 とは言ったものの今回は1パターンの関数だけを__autoload()にスタックします。
<?php class AutoLoader { /* オートローダーが探しにいくディレクトリ */ protected $dirs; /* __autoload()の実装として、下記のautoLoad()を登録する */ public function register() { spl_autoload_register(array($this, 'autoLoad')); } /* 探索ディレクトリを登録するメソッド */ public function registerDir($dir) { $this->dirs[] = $dir; } /* autoloadはインスタンス生成時に呼ばれるがそのとき対象となるクラス名を引数として引き受ける */ public function autoLoad($className) { foreach ($this->dirs as $dir) { $file = $dir . '/' . $className . '.php'; if (is_readable($file)) { require $file; return; } } } }
下記の用に使う
<?php require 'AutoLoader.php'; $autoLoader = new AutoLoader(); $autoLoader->registerDir(dirname(__FILE__). '/directory'); //directoryをサーチ対象として登録 $autoLoader->register(); //