はじめに
PHPでクラスファイルを読み込んでいくと、気づいたらrequire_onceがたくさん羅列している状況に。。
これを改善する為、オートロード処理を行います。
今回の設定
たとえば、以下のようなディレクトリ構造のとき。
hoge/
├ ClassA.php
├ ClassB.php
├ ClassC.php
└ Main.php
ファイルを読み込んでいくとrequire_onceがたくさん。
Main.php
<?php
require_once('./ClassA.php');
require_once('./ClassB.php');
require_once('./ClassC.php');
そこでオートロードを行います。
オートロードを行うことで、newしたいクラスを毎度requireする必要がなくなります。
オートロード処理
まず、Main.phpと同じhogeディレクトリにAutoload.php
を作成します。
hoge/
├ ClassA.php
├ ClassB.php
├ ClassC.php
├ Autoload.php
└ Main.php
続いてAutoload.phpに処理を書いていきます。
Autoload.php
<?php
class Autoload
{
private $directories = array();
//newしたいクラスを探すディレクトリを登録します。
//今回の場合はhogeディレクトリが引数に入ります。
public function registerDirectory($dir)
{
$this->directories[] = $dir;
return;
}
//未定義のクラスが呼ばれると、loadClass(コールバック関数)が呼ばれる処理です。
public function register()
{
//spl_autoload_register関数は、未定義のClassAが呼ばれた場合、"ClassA"を探しにいくよっていう関数です。
spl_autoload_register(array($this, 'loadClass'));
}
//引数には未定義のクラス名が入れられます。
//$filepathについては、今回の場合だとhogeディレクトリのパスが$dirに当てはまるイメージです。
public function loadClass($className)
{
foreach ($this->directories as $dir) {
//ClassAを探す場合は右のようになります。 $filepath = hoge/ClassA.php;
$filePath = $dir . '/' . $className . '.php';
if (is_readable($filePath)) {
require $filePath;
return;
}
}
}
}
次はMain.phpを修正します。
Main.php
//require_once('./ClassA.php');
//require_once('./ClassB.php');
//require_once('./ClassC.php');
require_once('./Autoload.php');
$loader = new Loader();
//__DIR__はマジック定数といい、フルパスが入ります。
$loader->registerDirectory(__DIR__);
$loader->register();
これで、たとえMain.phpでClassAやClassBがnewされても、オートロード処理によってファイルを探しにいってくれます。
見栄え的にもすっきりしました。
今度はcomposerでオートローダーを入れることも試してみたいと思います。