読者です 読者をやめる 読者になる 読者になる

PHP の spl_autoload_register

JavaScript

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に変なレコードを追加してもいい。
しないと思うけど。