事情是这样的,昨天我面了个试,发现自己对自动加载了解的很片面,于是我就去看自动加载的机制,而网上的例子讲的都是方法含义,于是我自己写了个简单的例子。
什么是自动加载了?在php5之前是没有自动加载的,所以文件之间的引入单纯靠的是 大量的require/include,但是如果一个文件存在很多require那事情就大了,于是这时候引入了自动加载机制。
自动加载机制一开始是只有一个__autoload($class_name) {} 函数的,就是如果我们实例化类找不到该类就去调用这个函数了,但是后来发现不同的包的映射方式都是不一样的,
但悲催的是自动加载往往就是看类名与磁盘映射规则,所以这时候引入spl_autoload_register(),这个会用spl的__autoload替换掉原来的__autoload,并且可以自定义方法名如下:
function autoload($class_name) { //假如我是自己命名的方法
# 执行你的加载操作
}于是我们逐渐改用他,接下来我就会用spl的自动加载写一个demo,比如访问 http://www.autoload.com/admin/goods/index 时会加载到 文件 ./admin/goods/index.class.php,步骤如下:
①首先是配置一个虚拟主机,废话不多说教程百度有:https://jingyan.baidu.com/article/49ad8bce7661355834d8fad6.html
②然后在所配置的虚拟主机的根目录下 添加 .htaccess 内容如下:
RewriteEngine On
RewriteRule ^ index.php [L]
注:该作用是 将访问该主机的请求全部指向index.php文件进行处理。
③修改index.php文件,对其自动加载方法进行改写对应的映射规则如下:
global $paths;
//自动加载函数~用于加载类方法进来
function autoload($class_name) {
global $paths;
if(file_exists($paths['0'].'/'.$paths['1'].'.class.php')) {
require($paths['0'].'/'.$paths['1'].'.class.php');
}else {
die('404');
}
}
// 确保spl 自动加载栈已被初始化
if(false === spl_autoload_functions()){
if(function_exists('autoload')){
spl_autoload_register('autoload');
}
}
//这里先获取请求url,然后实例化一个类,此时会通过自动加载将类方法加载进来
$base_path = ltrim($_SERVER['REQUEST_URI'], '/');
$paths = explode('/', $base_path);
//实例化类,并调用对应的方法
$obj = new $paths['1']();
if(method_exists($obj, $paths['2'])) {
$obj->$paths[2]();
}else {
die('404');
}
④在当前根目录创建对应的文件 admin/goods.class.php 并代码如下:
class goods {
public function index() {
echo '这里是admin/goods.class.php下的index方法';
}
}
⑤此时重启下apache服务器可看见效果如下:
若使用错误不存在路径的会报错如下:
最后测试的项目结构如下: