読者です 読者をやめる 読者になる 読者になる

バカンス駆動開発

この前バカンスって言ったら「古っ」って言われました

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();    //

参考

PHP5.1.2以降のspl_autoload_registerを使う | AkisiのWEB制作日記

柿の種が降ってきてあわててミドリゾウリムシを持って逃げる防空頭巾姿の白い生き物がクラスの定義ファイルを読み込む手段に spl_autoload_register() をお勧めする7つの理由。 - 親方、空から覚え書きが!