php框架之自动加载与统一入口
现在PHP有很多的框架,基本都是以MVC为基础进行设计的。其实很多框架(像thinkphp,zf,symfont等)都有两个特性,自动加载类文件和统一入口。这里就简单实现以上两个特性。
假设PHP使用的版本在5.3以上,5.3以上支持命名空间
自动加载类文件:
我们做__autoload来实现,现在PHP官方是建议使用spl_autoload去实现,具体好处自己去google吧。这里还是简单的用__autoload去实现,来学习自动加载的原理。
目录结构:

inc.php:
<?php
function __autoload($clsName){
$clsInfo = explode("\\", $clsName);
$len = count($clsInfo);
$clsName = $clsInfo[$len - 1];
if($len == 1){
$clsInfo[$len - 1] = '/home/wwwroot/domain.com/library';
}else{
$pref = substr($clsName, 0, 3);
$clsInfo[0] = '/home/wwwroot/domain.com/module/' . $clsInfo[0];
if($pref == 'ctl'){
$clsInfo[$len - 1] = 'control';
}elseif($pref = 'mdl'){
$clsInfo[$len - 1] = 'module';
}else{
$clsInfo[$len - 1] = 'library';
}
}
$clsFile = implode("/", $clsInfo) . "/" . $clsName . ".php";
$clsFile = realpath($clsFile);
if($clsFile){
require_once($clsFile);
}else{
exit("{$clsFile} is not exists!!");
}
}
上面这个加载函数的应用实例:
require_once(inc.php);
new libEntry();//加载/home/wwwroot/domain.com/libEntry.php
new /libEntry(); //加载/home/wwwroot/domain.com/library/libEntry.php
new /index/clsIndex(); //加载/home/wwwroot/domain.com/module/index/control/clsIndex.php
new /index/mdlDb(); //加载/home/wwwroot/domain.com/module/index/module/mdlDb.php
new /index/libUser(); //加载/home/wwwroot/domain.com/module/index/library/libUser.php
统一入口:
libRouter.php:
<?php
class libRouter{
private $entry;
private $control;
private $method; function __construct(){
$url = $_GET['_URL_'];
$urlInfo = explode('/', trim($url, '/'));
$this->entry = $urlInfo[0];
$module = $urlInfo[1];
$params = explode('-', $module);
$len = count($params);
$this->control = $params[0];
if($len % 2 == 0){
$this->method = $params[1];
unset($params[1]);
}else{
$this->method = '';
}
unset($params[0]);
$data = array_values($params);
$len = count($data);
for($i = 0; $i < $len; $i += 2){
$GLOBAL['_params'][$data[$i]] = $data[$i + 1];
}
} public function route(){
$base = '/home/wwwroot/domain.com/module/';
$base .= $this->entry . '/';
if(!$this->entry || !is_dir($base)){
exit('Error entry!');
}
!$this->control && $this->control = 'index';
!$this->method && $this->method = 'index'; $controlName = 'ctl' . ucfirst($this->control);
$controlFile = "{$base}control/{$controlName}.php";
if(!is_file($controlFile)){
exit('Error control!!');
} require_once "{$controlFile}";
$control = new $controlName(); $methods = array($this->method, 'index');
$method = null;
foreach($methods as $tmp){
$tmp = 'func' .ucfirst($tmp);
if(method_exists($control, $tmp)){
$method = $tmp;
break;
}
}
if(empty($method)){
exit("Error method!!");
} $control->$method();
}
}
实例应用:
index.php:
<?php
require_once('inc.php');
$router = new libRouter();
$router->route();
module/index/control/ctlIndex.php:
<?php
class ctlIndex{
function __construct() {
//;
}
public function funcIndex(){
echo 'Hello World!';
}
}
module/index/control/ctlUser.php
<?php
class ctlUser{
function __construct() {
//;
}
public function funcGetName(){
echo "My Name is Happy.";
}
}
配置nginx:
在nginx配置文件中,对应的域名配置下,加入下面的语句。
#访问的文件不存在是,统一由index.php处理。
if(!-f $request_filename){
rewrite ^(.*)$ /index.php?_URL_=$1 last;
}
实例:
配置完上面的所有内容,我们接下来,访问看看:


其实上面两个链接分别被nginx处理为:
www.domain.com/index.php?_URL_=/index/user-getName
www.domain.com/index.php?_URL_=/index/index-index
总结:
以上就简单的完成了,统一入口和自动加载类的实现了。当然, 要应用到生产环境中,这样是远远不够的,至少还要加上对于类名的过滤,及没有提交类名和方法时的默认调用:
比如直接访问www.domain.com时,默认调用module/index/ctlIndex.php里的funcIndex方法。
php框架之自动加载与统一入口的更多相关文章
- 构建自己的PHP框架之自动加载类中详解spl_autoload_register()函数
在了解这个函数之前先来看另一个函数:__autoload. 一.__autoload 这是一个自动加载函数,在PHP5中,当我们实例化一个未定义的类时,就会触发此函数.看下面例子: printit.c ...
- 十五、CI框架之自动加载数据库
一.在config的autoload.php文件中,如果写入以下代码,那么在控制器中无需再次加载数据库了,相当于全局自动加载数据库了 不忘初心,如果您认为这篇文章有价值,认同作者的付出,可以微信二维码 ...
- phper必知必会之类库自动加载的七种方式(三)
## php自动加载 下面显示例子的文件目录结构图 一.没有使用命名空间的几种实现 test/oneClass.php class oneClass{ public function show(){ ...
- Yii2的深入学习--自动加载机制
Yii2 的自动加载分两部分,一部分是 Composer 的自动加载机制,另一部分是 Yii2 框架自身的自动加载机制. Composer自动加载 对于库的自动加载信息,Composer 生成了一个 ...
- Yii2的深入学习--自动加载机制(转)
Yii2 的自动加载分两部分,一部分是 Composer 的自动加载机制,另一部分是 Yii2 框架自身的自动加载机制. Composer自动加载 对于库的自动加载信息,Composer 生成了一个 ...
- thinkphp系列:类的自动加载是如何设计的
在使用框架开发时,可以发现框架有很多核心类,却很少看到显示的引入某个文件的代码,这是因为框架都采用了类的自动加载机制,即使用到类时,框架会自动找到该类所在文件的位置并引入该文件.为了更容易看出代码思路 ...
- ThinkPHP5.0源码学习之注册自动加载
ThinkPHP5框架的自动注册加载流程如下:
- angularjs自动加载和手动加载
(一)自动加载 ng-app是angular的一个指令,代表一个angular应用(也叫模块).使用ng-app或ng-app=""来标记一个DOM结点,让框架会自动加载.也就是说 ...
- PHP PSR4自动加载代码赏析
第一部分是引入自动加载配置文件 1.入口文件:autoload.php里面没什么东西,就是导入ComposerAutoloader主题文件,一般由一个复杂的名字,不过不用担心就是机器随机生成的一个码而 ...
随机推荐
- AJPFX实践 java实现快速排序算法
快速排序算法使用的分治法策略来把一个序列分为两个子序列来实现排序的思路: 1.从数列中挑出一个元素,称为“基准“2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面 ...
- (六)Mybatis总结之延迟加载
应用场景: i.假如一个用户他有N个订单(N>=1000),那么如果一次性加载的话,一个用户对象的订单集合OrderList里面就会有1000多个Order的对象.计算:一个订单对象里面数据有多 ...
- IntentFilter的相关问题解析
IntentFilter是配合Intent而生的,你有目标行动或者结果,那么那些行动和结果就会有他完成的特定要求,这些要求就是IntentFilter,可以理解为Intent和IntentFilter ...
- JSP标签 <meta.....>作用总结
<metahttp-equiv="pragma" content="no-cache"> <metahttp-equiv="cach ...
- struts2 使用json
前台代码: Struts.xml: UserAction: 注意: 1)struts类库里面没有提供ezmorph-1.0.6.jar文件,所以要手动添加:
- ARP是如何工作的?
我们知道,当我们在浏览器里面输入网址时,DNS服务器会自动把它解析为IP地址,浏览器实际上查找的是IP地址而不是网址.那么IP地址是如何转换为第二层物理地址(即MAC地址)的呢? 在局域网中,这是通过 ...
- Vue打包之后部署到 express 服务器上
Part.1 安装 express npm install express body-parer --save Part.2 在项目根目录下创建 app.js 文件作为启动 express 服务器代码 ...
- SqlSever锁及存储过程优化
SqlSever锁及存储过程优化 SQL server的所有活动都会产生锁.锁定的单元越小,就越能提高并发处理能力,但是管理锁的开销越大.如何找到平衡点,使并发性和性能都可接受是SQL Server的 ...
- CGPathAddArc
使用CGPathAddArc使UIView的Layer绕中心点旋转 2012-12-04 15:38 775人阅读 评论(0) 收藏 举报 animationAnimationiosiOSIOSlay ...
- Chrome插件:本地程序实现验证码破解(浏览器与本地进程通信)
利用chrome调用本地程序破解图片验证码background.js var port = null, tabId, fname = "vcode.chrome.v1.item.01&quo ...