PHP自动加载机制

PHP 项目的文件越来越多,类一多起来,维护就有点乱套。这个时候,自动加载就挺香的,尤其是用上 spl_autoload_register,感觉整个项目都清爽了不少。

早期的 __autoload 方法也能用,就是有点笨,不支持命名空间,还得自己硬编码路径,稍微一变结构就崩。你可以先看看:

function __autoload($className) {
  if (file_exists($className . '.php')) {
    include_once $className . '.php';
  } else {
    exit('文件不存在');
  }
}

现在更推荐用 spl_autoload_register,灵活得多,能注册多个函数,还能配合命名空间来玩:

spl_autoload_register(function ($class) {
  include_once str_replace('\\', '/', $class) . '.php';
});

有时候,你会多个地方都想加载逻辑,那就再注册几个:

spl_autoload_register('loader1');
spl_autoload_register('loader2');

配合 set_include_path() 还能指定多个目录去找类文件,路径灵活,加载也稳。像 MVC 项目里,控制器、模型、库分开放,多级搜索就派上用场了。

下面这个例子就挺实用的,路径先配置好,定义一个 Loader 类来统一加载逻辑:

$config['include'] = array(
  'application/catalog/controllers',
  'application/catalog/models',
);

set_include_path(get_include_path() . PATH_SEPARATOR . implode(PATH_SEPARATOR, $config['include']));

class Loader { public static function autoload($class) { $path = str_replace('_', '/', $class) . '.php'; include_once $path; } }

spl_autoload_register(array('Loader', 'autoload'));

嗯,这样你就不用到处写 require_once 了,结构也干净多了。适合用在你自己的小框架里,或者搭建轻量后台系统。

如果你刚好在重构老项目,或者写新框架,强烈建议试试 spl_autoload_register,配合命名空间用起来更爽。

doc 文件大小:49KB