php类最佳自动加载及原理

在php5以前,我们要用某个类或类的方法,那必须include或者require,之后才能使用,每次用一个类,都需要写一条include,麻烦

php作者想简单点,最好能引用一个类时,如果当前没有include进来,系统能自动去找到该类,自动引进~


php的自动加载未定义类过程:

1. 检查是否注册autoload_func

2. 如果没有注册autoload_func,则检查是否定义了__autoload;如果有定义__autoload则执行用户定义的加载方式,如果没有定义__autoload则返回错误。

3. 如果有注册autoload_func则执行注册的加载函数,不执行__autoload。



php有两种自动加载方式:

1. 通过定义__autoload函数来处理未定义类的加载;

2. 通过注册autoload_func来处理未定义类的加载,即:通过spl_autoload_register来注册autoload_func

当中注册autoload_func的方式的优先级高于使用__autoload方式,也就是说,假如同时定义__autoload和注册autoload_func,只会执行注册的autoload_func,不会继续执行__autoload。





当前为最佳形式。

通常我们将spl_autoload_register(*)放在入口脚本,即一开始就引用进来。比如下面discuz的做法。



if(function_exist('spl_autoload_register')){
    //如果是php5以上,存在注册函数,则注册自己写的core类中的autoload为自动加载函数
  spl_autoload_register(array('core','autoload')); 
  
}else{

    //如果不是,则重写php原生函数__autoload函数,让其调用自己的core中函数。
  function __autoload($class){        
    return core::autoload($class);
  }
  
  
}



使用spl_autoload_register方式

SPL(Standard PHP Library),是php的标准库,php5.1+ 支持。spl的自动加载机制主要原理就是通过spl_autoload_register注册函数,并且将php中autoload_func指向了注册的函数。如果通过spl_autoload_register来注册函数,spl会执行它默认的spl_autoload()函数。



这段扔在入口文件最前面,自然是极好的~