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

来源:互联网 发布:mac战网国服改台服 编辑:程序博客网 时间:2024/06/10 08:13

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

什么是自动加载了?在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文件,对其自动加载方法进行改写对应的映射规则如下:

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

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

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


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



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