PHPのクラスをオートロードするのには spl_autoload_register() を利用する。
ただ、これを利用すれば自動的にロードしてくれるかというと、そうでもない。
ロードするロジックは自分で実装する必要がある。
そもそも spl_autoload_register() はクラスが存在しない場合に指定した関数を呼んでくれるエラーハンドラーみたいなもの。
*実際にはマニュアル通りの「指定した関数を __autoload() の実装として登録する」という説明がしっくりくるけど、
__autoload() を説明するのが面倒なのでエラーハンドリングという表現をします。
以下はPHPのマニュアルから抜粋したもの。
http://php.net/manual/ja/function.spl-autoload-register.php
spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] ) autoload_function 登録したい autoload 関数。 パラメータが指定されなかった場合は、デフォルト実装である spl_autoload() が登録されます。 throw このパラメータは、 spl_autoload_register() が autoload_function を登録できなかったときに例外をスローするかどうかを指定します。 prepend true の場合、spl_autoload_register() はキューの最後に追加するのではなく先頭に追加します。
ちなみに、FuelPHPの autoload.php では以下のようになっている。
spl_autoload_register('Autoloader::load', true, true);
つまり、FuelPHPの例で言うと、クラスを利用する際にクラスファイルをrequire()していなかった場合は
spl_autoload_register() に登録された Autoloader::load() が呼ばれるってこと。
では、FuelPHPのAutoloader::load() は何をしているかというと、
load() から init_class() を呼び出して、include() している。
*FuelPHPのコードを全部載せても見づらいから、かなり省略してます。
protected static function init_class($class, $file = null) { if ($file) { include $file; //includeしている。 } //省略 }
最初に
「そもそも spl_autoload_register() はクラスが存在しない場合に指定した関数を呼んでくれるエラーハンドラーみたいなもの。」
と説明したのは
例外が try + catch でエラーをハンドリングしても、
catch に何も書かなければ意味が無いということと、
spl_autoload_register() も
登録した関数に何も書かなければ意味が無いということで
似ているかなと・・・・。
違うかな・・・。
なので、極端なこと言うと、
クラスがない場合に include() しないでDBに変なレコードを追加してもいい。
しないと思うけど。