spl_autoload_register
spl_autoload_register — 注册给定的函数作为 __autoload 的实现
bool spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] )
参数
autoload_function
欲注册的自动装载函数。如果没有提供任何参数,则自动注册 autoload 的默认实现函数spl_autoload()。
throw
此参数设置了 autoload_function 无法成功注册时, spl_autoload_register()是否抛出异常。
prepend
如果是 true,spl_autoload_register() 会添加函数到队列之首,而不是队列尾部。
Node: 自动加载揭秘
<?php
function a ($c) {
echo "a\n";
class Ala {
function __construct(){
echo "Ala __construct";
}
}
}
function b ($c) {
class Bla {
function __construct(){
echo "Bla __construct";
}
}
echo "b\n";
}
spl_autoload_register(function ($class_name){
echo " My Closure $class_name \n";
}; // 注册 但是没有执行
spl_autoload_register('a'); // 注册 但是没有执行
spl_autoload_register('b'); // 注册 但是没有执行
$c = new Bla();
?>
output:
My Closure Bla // 第一个注册的,发现new 的类不在这里继续下面执行
a // 执行第二个注册的 发现不是 继续下面
b // 执行第三个注册的 发现在这里 所以开始 new
Bla __construct // new 成功 __construct 执行
new 类的时候 会跑到 spl_autoload_register() 注册方法中寻找
01、注册是有先后顺序的
02、在没有找到之前的方法都会被执行
03、找到之后 后面注册的就不会执行了
Example #1 带有 namespace 自动注册
test.php
<?php
namespace test;
class test{
function __construct(){
echo "Test created\n";
}
}
?>
然后我们可以使用下面的代码来加载类:
<?
spl_autoload_register(function(){
require "./test.php";
});
$t = new \test\test();
?>