0
1

More than 3 years have passed since last update.

PHPでオートロード(spl_autoload_register)処理を行う

Posted at

はじめに

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でオートローダーを入れることも試してみたいと思います。

参考

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1