类的自动加载
-
当你在某个PHP文件中去使用一个你不确定的类的时候,你无法确定包含这个类的外部文件是否被引用
-
Once函数效率又很低
-
请使用
__autoload($className)
函数,当你引用的类不存在的时候,你可以在这个函数中去引用包含文件- 这个函数是当你引用一个不存在的类时,系统给你一次在报错之前进行处理的机会
- 也就是说这个函数触发的时机是,类不存在–》执行__autoload函数–》报错
- 这个函数接受一个参数,这个参数是你引用的而不存在的类名
-
示例:
$a = new moudle1();
function __autoload($className){
include('/module/' . $className . '.php');
}
- 当实例化moudle1这个类时,到这一行,肯定是要报错的,如果没有其他的处理方法
- 当判断当前页面无此类时,而也没有那么引入的文件有这个类,则进入__autoload函数中,此时,你可以引用与之对应的文件,当然这个就看你自己的命名了;
- 类声明全局有效,不管是在多深的作用域中
自定加载函数换个名字
spl_autoload_register
,注册给定的函数作为__autoload函数的实现;- 上面这句话就是说,注册一个函数,作为__autoload函数的替换,就是换个名字;
- 他还有两个参数,具体的请翻阅PHP手册;
- 静态方法也可以作为自动加载方法,示例:
class Say{
static function zidongjiazai($class){
echo $class;
}
}
spl_autoload_register(array('Say','zidongjiazai'));
spl_autoload_register('Say::zidongjiazai');
new C();
- 如果用类的话,则方法必须是静态的;
自动加载的应用场景
- 例如你可以做一个文件自动加载的系统
- 只要规定好PHP文件名,比如类文件,模型文件,模块文件,组件文件,分别命名成不同的单词
- 如果文件名中存在某个类型文件的关键词,那就去这个对应的目录下去加载,就不用在每个文件里都去手动加载文件了;
__autoload
函数不能被重复定义,所以当你想对不同类型文件进行目录上的不同引用,你可以写if…else…,但是更好的方法是,你可以实用spl_autoload_register
函数去注册多个__autoload的实现方法- 按照注册的先后顺序进行加载;