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,配合命名空间用起来更爽。
评论区