您的位置:首页 > 编程语言 > PHP开发

php如何使用自动加载(重写url形成单一入口)

2017-06-30 18:44 477 查看
事情是这样的,昨天我面了个试,发现自己对自动加载了解的很片面,于是我就去看自动加载的机制,而网上的例子讲的都是方法含义,于是我自己写了个简单的例子。

什么是自动加载了?在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 内容如下:

<IfModule mod_rewrite.c>
RewriteEngine On

RewriteRule ^ index.php [L]
</IfModule>
注:该作用是 将访问该主机的请求全部指向index.php文件进行处理。

③修改index.php文件,对其自动加载方法进行改写对应的映射规则如下:

<?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 并代码如下:

<?php
class goods {
public function index() {
echo '这里是admin/goods.class.php下的index方法';
}
}


⑤此时重启下apache服务器可看见效果如下:



若使用错误不存在路径的会报错如下:



最后测试的项目结构如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: