Web/DB プログラミング徹底解説

ホーム > PHP プログラミング > クラスのオートローディング

クラスのオートローディング

PHP のクラスは1クラスを1ファイルに記述することがよく行われます。 この場合、多数のクラス定義を取り込む場合、多数の require を記述する必要があり、 コードのメンテナンス面でも不便です。必要なクラスが増えるたびにそれを利用するクラス定義を取り込まなければなりませんが、 PHP は実行時までその過不足がチェックされないからです。(C言語などではコンパイル時に未定義のクラスは判別可能ですよね)

そこで、実行時に足りないクラスをロードできる仕組みがあれば便利です。
それを実現するのが __autoload 関数です。

__autoload 関数を定義しておくと、実行時に未定義のクラスがあった場合に、__autoload 関数が呼び出されます。 これによって、クラス定義を読み込むチャンスが得られます。

例を見てみましょう。

<?php
$obj = new MyClass1();
$obj->foo();
?>

上記コードを実行しようとしても、ユーザー定義クラス MyClass1 が未定義であるため正常に実行できません。

そこで、次のように __autoload 関数を定義します。

こうすると __autoload 関数の引数として未定義のクラス名が渡されます。 ここでは $className に "MyClass1" が入ります。 従ってこのクラス名を用いて、取り込むべきファイル名を作り、それを require_once などで取り込むことによって、 正常にプログラムの実行を継続することが可能となります。

<?php
function __autoload( $className ) {
     require_once 'class.' . $className . '.php';
}

$obj = new MyClass1();
$obj->foo();

?>

このコードでは、__autoload 関数の引数に "MyClass1" という文字列が渡されるので、 'class.' . $className . '.php' は結局、'class.MyClass1.php' という文字列になります。

従って、__autoload 関数では 'class.MyClass1.php' という名前のファイルを require_once 取り込んだことになります。

ですから、1クラス1ファイルにしておくとよさそうですね。