【図解】phpのautoloaderとは?使用例と概要を説明。

PHP プログラミング

phpにはautoloaderという機能があります。

知っている人は知っている。そうでない人も名前ぐらいは聞いた事があるかもしれません。

この記事ではautoloaderについて説明していきます。

load(読み込む)とは?

loadとは、phpにおいてはincludeやrequireでファイルを読み込む事を指しています。

例えばこんなディレクトリ構成があります。

main.phpとMyClass.phpには以下のような内容です。

<?php
// main.php
$a = new MyClass();
$a->print();
<?php
// MyClass.php
class MyClass {
    public function print() {
        print 'print MyClass'.PHP_EOL;
    }
}

main.phpすると以下のようなエラーになります。

PHP Fatal error:  Uncaught Error: Class 'MyClass' not found in /al2.php:2

「MyClass」というクラスが見つからないという内容です。

エラーが出ないようにするにはinclude()またはrequire()を使ってMyClass.phpをロードする(読み込む)必要があります。

<?php
// main.php
require('MyClass.php'); // MyClass.phpをロードする
$a = new MyClass();
$a->print();

// 実行結果
// print MyClass

phpの「ロード」とはinclude()やrequire()でファイルを読み込むこと。

autoloaderとは?

phpのautoloaderとは、ファイルを自動的(auto)に読み込む(loader) 仕組み です。

いつ自動で読み込まれるのかというと、「クラスが見つからなかった時」です。

どのように読み込むかは開発者が自分で決めて、関数として定義する必要があります。

作成した関数をautoloaderとしてphpに登録するには、spl_autoload_register()を使います。

autoloaderは、クラスが見つからなかった時に自動でファイルを探して読み込む仕組み。

autoloaderを登録するspl_autoload_register()関数

phpの標準関数にspl_autoload_register()という関数があります。

PHP: spl_autoload_register – Manual

クラスが見つからなかった時に動かす処理を関数として定義し、autoloaderとして登録しておく事ができます。

例えばmain.phpを以下のように書き直します。

<?php
// autoloaderに登録する関数を定義する
function myloader($class) {
    include $class.'.php';
}

// autoloaderに関数を登録する
spl_autoload_register('myloader');                                                                                      

$a = new MyClass();
$a->print();

// 実行結果
print MyClass

MyClassが正常に読み込まれて、うまく動きました。

autoloaderの動作イメージ

以下のイメージ図のように、まずはじめにautoloaderに関数を登録する処理を行っています。

対応するソースコードは以下の部分です。

// autoloaderに登録する関数を定義する
function myloader($class) {
    include $class.'.php';
}

// autoloaderに関数を登録する
spl_autoload_register('myloader');   

phpは、実行時に「クラスが見つからない」という状態が発生した時にautoloaderを呼び出します。
この時、「見つけられなかったクラス名」がautoloaderの引数になります。

今回の例では「new MyClass();」を実行した時点でクラスが定義されていないので、「’MyClass’」という文字列を引数としてautoloaderを呼び出します。

イメージは以下のようになります。

対応するソースコードは以下の部分です。

$a = new MyClass(); // この時autoloaderが発動する。
$a->print();

autoloaderには自分で定義した「myloader()」が登録されているので、このmyloader関数が「’MyClass’」という文字列を引数として受け取ります。
つまり「myloader( ‘MyClass’ );」という処理が実行されるのと同じになります。

そしてmyloader関数の処理として
「include $class.’.php’;」
が実行されます。
$classには「 ‘MyClass’ 」という文字列が入っているので、
「include MyClass.php;」が実行されることになります。

spl_autoload_register()で登録された関数は、実行時にクラスが見つからなかった時に呼び出される。

なぜautoloaderが必要なのか?

上記の例のように、読み込むファイルが一つだけの場合にはautoloaderの必要性はあまり感じません。

しかし、アプリケーションの規模が大きくなるにつれて、一つのファイルで読み込むクラスの数も増えていきます。

例えばMyClass、MyClassA、MyClassB、MyClassCを使う必要がある場合…

include 'MyClass.php'
include 'MyClassA.php'
include 'MyClassB.php'
include 'MyClassC.php'
…

といったようにincludeを何行も書くことになってしまいます。

autoloaderで自動でファイルを読み込めるようにしておく事で、こういった手間やinclude忘れによるエラーを防ぐことができます。

autoloaderを使う事で、クラスが増えたときに効率よく開発できる。

まとめ

  • autoloaderとはファイルを自動的に読み込む仕組み
  • クラスが見つからなかった時に発動する
  • spl_autoload_register()で関数をautoloaderとして登録しておく
  • 読み込むクラスが増えた時に開発効率が上がる

autoloaderの説明は以上です。

コメント/ピンバック

  1. […] PHP: クラスのオートローディング – Manual【図解】phpのautoloaderとは?使用例と概要を説明。 […]

タイトルとURLをコピーしました