php如何使用自动加载(重写url形成单一入口)
2017-06-30 18:44
477 查看
事情是这样的,昨天我面了个试,发现自己对自动加载了解的很片面,于是我就去看自动加载的机制,而网上的例子讲的都是方法含义,于是我自己写了个简单的例子。
什么是自动加载了?在php5之前是没有自动加载的,所以文件之间的引入单纯靠的是 大量的require/include,但是如果一个文件存在很多require那事情就大了,于是这时候引入了自动加载机制。
自动加载机制一开始是只有一个__autoload($class_name) {} 函数的,就是如果我们实例化类找不到该类就去调用这个函数了,但是后来发现不同的包的映射方式都是不一样的,
但悲催的是自动加载往往就是看类名与磁盘映射规则,所以这时候引入spl_autoload_register(),这个会用spl的__autoload替换掉原来的__autoload,并且可以自定义方法名如下:
①首先是配置一个虚拟主机,废话不多说教程百度有:https://jingyan.baidu.com/article/49ad8bce7661355834d8fad6.html
②然后在所配置的虚拟主机的根目录下 添加 .htaccess 内容如下:
③修改index.php文件,对其自动加载方法进行改写对应的映射规则如下:
④在当前根目录创建对应的文件 admin/goods.class.php 并代码如下:
⑤此时重启下apache服务器可看见效果如下:
若使用错误不存在路径的会报错如下:
最后测试的项目结构如下:
什么是自动加载了?在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服务器可看见效果如下:
若使用错误不存在路径的会报错如下:
最后测试的项目结构如下:
相关文章推荐
- php入门篇------->PHPCMS 入口文件,自动加载系统函数和URL规则
- php的_autoload函数实现自动加载类的使用
- php中使用__autoload()自动加载未定义类的实现代码
- 教教大家如何使用php程序开发一个自动识别移动设备
- 如何使用composer的autoload来自动加载自己编写的函数库与类库
- ubuntu上使用PHP依赖管理工具Composer(二)——自动加载
- PHP __autoload()函数(类文件自动加载规则)的使用方法
- Android&iOS:如何在外部启动app(若有安裝APP, 则自动启动app(使用 URL Schema), 若没有安装, 则询问是不是到应用市场下载)
- PHP使用__autoload()函数自动加载未定义的类
- ThinkPHP中通过URL重写隐藏应用的入口文件index.php的相关服务器的配置
- 分享如何使用PHP将URL地址参数进行加密传输提高网站安全性
- phpexcel 使用一,解决自动加载问题
- php命名空间自动加载后使用单独类include使用
- 如何正确配置Nginx+PHP及正确的nginx URL重写
- 如何使用PHP+jQuery+MySQL实现异步加载ECharts地图数据(附源码下载)
- PHP的autoload自动加载机制使用说明
- 教你如何在CI框架中使用 .htaccess 隐藏url中index.php
- php命名空间与自动加载函数一起使用
- 教你如何在CI框架中使用 .htaccess 隐藏url中index.php
- 解析PHP入口文件的自动加载功能