spl_autoload_register
指定した関数を __autoload() の実装として登録する
説明
bool spl_autoload_register(callablenull $callback = null, bool $throw = true, bool $prepend = false)
もしあなたのコード中に __autoload 関数が存在するのなら、
それを明示的に __autoload キューに登録しなければなりません。
なぜなら、spl_autoload_register は、
spl_autoload あるいは spl_autoload_call によって
__autoload 関数のエンジンキャッシュを効率的に置き換えるからです。
複数の autoload 関数が必要となる場合でも spl_autoload_register
は対応できます。この関数は autoload 関数のキューを作成し、
定義された順にそれを実行していきます。一方
__autoload は、一度しか定義できません。
パラメータ
-
callback
-
登録したい autoload 関数。
null を指定した場合、デフォルト実装である
spl_autoload が登録されます。
void callback(string $class)
class には、完全修飾子を示す、先頭のバックスラッシュが付くことはありません。
-
throw
-
このパラメータは、
spl_autoload_register
が callback
を登録できなかったときに例外をスローするかどうかを指定します。
警告
このパラメータは、PHP 8.0.0 以降は無視されます。
かつ、false を設定すると警告が発生します。
spl_autoload_register は、
引数が不正な場合常に TypeError
をスローするようになっています。
-
prepend
-
true の場合、spl_autoload_register
はキューの最後に追加するのではなく先頭に追加します。
戻り値
成功した場合に true を、失敗した場合に false を返します。
例
例1 spl_autoload_register を __autoload 関数の代わりに使う例
<?php
// function __autoload($class) {
// include 'classes/' . $class . '.class.php';
// }
function my_autoloader($class) {
include 'classes/' . $class . '.class.php';
}
spl_autoload_register('my_autoloader');
// あるいは、無名関数も使えます
spl_autoload_register(function ($class) {
include 'classes/' . $class . '.class.php';
});
?>
例2 spl_autoload_register でクラスをロードしない例
<?php
namespace Foobar;
class Foo {
static public function test($class) {
print '[['. $class .']]';
}
}
spl_autoload_register(__NAMESPACE__ .'\Foo::test');
new InexistentClass;
?>
[[Foobar\InexistentClass]]
Fatal error: Class 'Foobar\InexistentClass' not found in ...
例3 識別子には先頭のバックスラッシュが付かない
<?php
spl_autoload_register(static function ($class) {
var_dump($class);
});
class_exists('RelativeName');
class_exists('RelativeName\\WithNamespace');
class_exists('\\AbsoluteName');
class_exists('\\AbsoluteName\\WithNamespace');
?>
string(12) "RelativeName"
string(26) "RelativeName\WithNamespace"
string(12) "AbsoluteName"
string(26) "AbsoluteName\WithNamespace"