spl_autoload_register 使おうぜ

notoです。

PHPでクラス数が多くなると必然とrequireが多くなっていきます。継承関係にあったりすると直すのがとてもめんどくさいですよね。 PHP5.1.2から、spl_autoload_registerという関数を利用できるようになりました。

そこで今回は、spl_autoload_registerを利用してクラスローダーを作成していきます。

動作環境

  • PHP 5.3.8
  • CentOS 5.6

クラスローダーを実装する

webroot/core/ClassLoader.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<?php
/**
 *
 * クラスローダー
 * @author noto
 *
 */
class ClassLoader{


    /**
     *
     * ディレクトリ格納
     * @var unknown_type
     */
    private $dirs = array();


    /**
     *
     * コンストラクタ
     */
    public function __construct() {
        spl_autoload_register(array($this, 'loader'));
    }


    /**
     *
     * ディレクトリを登録
     * @param string $dir
     */
    public function registerDir($dir){
        $this->dirs[] = $dir;
    }


    /**
     *
     * コールバック
     * @param string $classname
     */
    public function loader($classname){

        foreach ($this->dirs as $dir) {

            $file = $dir . '/' .  $classname . '.php';
            if(is_readable($file)){
                require $file;
                return;
            }
        }
    }
}

ClassLoaderクラスのloaderメソッドをコールバックとして登録します。 そうすることで、未定義のオブジェクトのインスタンスが存在しない場合、loaderメソッドがコールバックされます。

registerDirには、読み込みたいクラスが存在するディレクトリを登録します。

index.phpを作成し、registerDirにディレクトリを登録してみます。

index.php
1
2
3
4
5
<?php
require dirname(__FILE__) . '/core/ClassLoader.php';

$classLoader = new ClassLoader();
$classLoader->registerDir(dirname(__FILE__) . '/core');

requireをファイルそれぞれに記載するのはめんどくさいし、クラスを追加したらそのままnewできないのはイライラします。 クラスローダーは簡単に実装できるので、是非使ってみてください。

参考文献

パーフェクトPHP

Comments