php 自动加载机制

归纳一下php加载文件3种方式:
1、include,include_once,requice,requice_one常规加载
2、__autoload()
3、spl_autoload_register()

  1. 最常规的加载方法,在小项目小代码里使用的是 4个常用函数 include, include_once,require, require_once,他们之间的区别是
    ~incluce在用到时加载
    ~require在一开始就加载
    ~_once后缀表示已加载的不加载
    此外,include要包括的文件找不到时会给一个警告,require会报一个严重的错误,要求较高的可以采用require。
//No.1
require('config.php');
require('login.php');
$a = new config();
  1. 引入__autoload的魔术方法进行加载,引入的原因是单项目较大,文件较多的时候如果采用require一个一个包含的话,耗费时间又使得代码冗长。使用autoload在new对象时会按照魔术方法中的规则自动加载。
//N0.2
function __autoload($class)
{
    $file = $class . '.php';
    if (is_file($file)) {
        require_once($file);
    }
}
$a = new config();
$b = new login();
  1. 在大型系统的开发中,如果需要使用很多其它的类库,这些类库可能是由不同的开发人员编写的,其类名与实际的磁盘文件的映射规则不尽相同。这时如果要实现类库文件的自动加载,就必须在__autoload()函数中将所有的映射规则全部实现,这样的话__autoload()函数有可能 会非常复杂,甚至无法实现。
    spl_autoload_register() 满足了此类需求。 它实际上创建了 autoload 函数的队列,按定义时的顺序逐个执行。相比之下, __autoload() 只可以定义一次。
//No.3
function loader($class)
{
    $file = $class . '.php';
    if (is_file($file)) {
        require_once($file);
    }
}
spl_autoload_register('loader');
$a = new config();
$b = new login();

//No.4
class Loader{
    public static function loadClass($class) {
        $file = $class . '.php';
        if(is_file($file)) {
            require_once($file);
        }
    }
}
spl_autoload_register(array('Loader', 'loadClass'));
$a = new config();
$b = new login();

此外根据php.net 给出的意见
php5.0 之后开始采用__autoload来自动加载类,但在使用过程中发现__autoload 函数抛出的异常不能被 catch 语句块捕获并会导致一个致命错误。(5.3.0之前的版本)所以建议采用spl_autoload_register

//N0.2 自动加载在 PHP 5.3.0+ 中的异常处理
/**
 * 在 5.3.0 版之前,__autoload 函数抛出的异常不能被 catch 语句块捕获并会导致一个致命错误。
 * 从 5.3.0+ 之后,__autoload 函数抛出的异常可以被 catch 语句块捕获,但需要遵循一个条件。
 * 如果抛出的是一个自定义异常,那么必须存在相应的自定义异常类。
 * __autoload 函数可以递归的自动加载自定义异常类。
 **/
function __autoload($class)
{
    $file = $class . '.php';
    if (is_file($file)) {
        require_once($file);
    }else{
//        echo "Want to load $class.\n";
//        throw new Exception("Unable to load $class.");
//        / **
//         * 5.3版本不支持自定义异常类,只能这样处理
          echo "Want to load $class.\n";
 throw new MissingException("Unable to load $class.");
//         */
    }
}
try {
    $obj = new test();
} catch (Exception $e) {
    echo $e->getMessage(), "\n";
}

你可能感兴趣的:(php)