多くの開発者は、オブジェクト指向アプリケーションを作成するときに、クラス定義ごとに PHP ソース ファイルを作成します。大きな煩わしさは、各スクリプトの先頭にインクルード ファイルの長いリスト (クラスごとに 1 つのファイル) を記述しなければならないことです。
PHP 5 では、これは必要なくなりました。まだ定義されていないクラスを使用しようとしたときに自動的に呼び出される __autoload() 関数を定義できます。この関数を呼び出すことにより、スクリプト エンジンは、PHP がエラーで失敗する前に、必要なクラスをロードする最後のチャンスを得ることができます。
ヒント
spl_autoload_register() は、クラスの自動ロードを実装するためのより柔軟な方法を提供します。したがって、__autoload() 関数の使用は推奨されなくなり、将来のバージョンでは非推奨になる可能性があります。
注:
バージョン 5.3.0 より前では、__autoload 関数によってスローされた例外は catch ステートメント ブロックによってキャッチできず、致命的なエラーが発生します。 5.3.0 以降では、__autoload 関数によってスローされた例外は catch ステートメント ブロックによってキャッチできますが、条件に従う必要があります。カスタム例外がスローされる場合は、対応するカスタム例外クラスが存在する必要があります。 __autoload 関数は、カスタム例外クラスを再帰的に自動的にロードできます。
注:
オートロードは、PHP の CLI インタラクティブ モードでは使用できません。
例 #1 自動ロードの例
この例では、MyClass1.php ファイルと MyClass2.php ファイルからそれぞれ MyClass1 と MyClass2 をロードしようとします:
function __autoload($class_name){ require_once $class_name.'.php'; } $obj = new MyClass1(); $obj2 = new MyClass2();
注: MyClass1.php と MyClass2.php は同じディレクトリにある必要があります。ロードする現在のスクリプト
別の例
この例は、インターフェイス ITest をロードしようとします:
function __autoload($name) { var_dump($name); } class Foo implements ITest { } /* string(5) "ITest" Fatal error: Interface 'ITest' not found in ... */
例 #3 PHP 5.3.0 以降で例外処理を自動的にロードします
この例は例外をスローし、 try/catch ステートメントで使用します。ブロック内のデモ。
function __autoload($name) { echo "Want to load $name.\n"; throw new Exception("Unable to load $name."); } try { $obj = new NonLoadableClass(); } catch (Exception $e) { echo $e->getMessage(), "\n"; }
上記のルーチンは次の出力を行います:
NonLoadableClass をロードしたい。
NonLoadableClass をロードできない。
例 #4 PHP 5.3.0 以降での自動ロード例外処理 - カスタム例外メカニズムなし
この例では、例外が発生しました。存在しないカスタム例外ハンドラーにスローされます。
上記のルーチンは出力します:
NonLoadableClass をロードしたい。
MissingException をロードしたい。
致命的なエラー: クラス 'MissingException' が testMissingException.php の行 4 に見つかりません