现在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框架之自动加载与统一入口的更多相关文章

  1. 构建自己的PHP框架之自动加载类中详解spl_autoload_register()函数

    在了解这个函数之前先来看另一个函数:__autoload. 一.__autoload 这是一个自动加载函数,在PHP5中,当我们实例化一个未定义的类时,就会触发此函数.看下面例子: printit.c ...

  2. 十五、CI框架之自动加载数据库

    一.在config的autoload.php文件中,如果写入以下代码,那么在控制器中无需再次加载数据库了,相当于全局自动加载数据库了 不忘初心,如果您认为这篇文章有价值,认同作者的付出,可以微信二维码 ...

  3. phper必知必会之类库自动加载的七种方式(三)

    ## php自动加载 下面显示例子的文件目录结构图 一.没有使用命名空间的几种实现 test/oneClass.php class oneClass{ public function show(){ ...

  4. Yii2的深入学习--自动加载机制

    Yii2 的自动加载分两部分,一部分是 Composer 的自动加载机制,另一部分是 Yii2 框架自身的自动加载机制. Composer自动加载 对于库的自动加载信息,Composer 生成了一个  ...

  5. Yii2的深入学习--自动加载机制(转)

    Yii2 的自动加载分两部分,一部分是 Composer 的自动加载机制,另一部分是 Yii2 框架自身的自动加载机制. Composer自动加载 对于库的自动加载信息,Composer 生成了一个  ...

  6. thinkphp系列:类的自动加载是如何设计的

    在使用框架开发时,可以发现框架有很多核心类,却很少看到显示的引入某个文件的代码,这是因为框架都采用了类的自动加载机制,即使用到类时,框架会自动找到该类所在文件的位置并引入该文件.为了更容易看出代码思路 ...

  7. ThinkPHP5.0源码学习之注册自动加载

    ThinkPHP5框架的自动注册加载流程如下:

  8. angularjs自动加载和手动加载

    (一)自动加载 ng-app是angular的一个指令,代表一个angular应用(也叫模块).使用ng-app或ng-app=""来标记一个DOM结点,让框架会自动加载.也就是说 ...

  9. PHP PSR4自动加载代码赏析

    第一部分是引入自动加载配置文件 1.入口文件:autoload.php里面没什么东西,就是导入ComposerAutoloader主题文件,一般由一个复杂的名字,不过不用担心就是机器随机生成的一个码而 ...

随机推荐

  1. Windowsforms 中对文件操作

    文件及文件夹操作: 引用命名空间:using system .IO; 1.File类: 创建:File.Create(路径);——返回FileStream FileStream fs = File.C ...

  2. H.264学习笔记4——变换量化

    A.变换量化过程总体介绍 经过帧内(16x16和4x4亮度.8x8色度)和帧间(4x4~16x16亮度.4x4~8x8色度)像素块预测之后,得到预测块的残差,为了压缩残差信息的统计冗余,需要对残差数据 ...

  3. vue2.0生命周期函数

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. CS2QS

    inline QString MotorCS2QS(CString cs) { return QString::fromWCharArray((LPCTSTR)cs, cs.GetLength()); ...

  5. CAD交互绘制圆(com接口)

    CAD绘制图像的过程中,画圆的情况是非常常见的,用户可以在控件视区点取任意一点做为圆心,再动态点取半径绘制圆. 主要用到函数说明: _DMxDrawX::DrawCircle 绘制一个圆.详细说明如下 ...

  6. Perl语言入门:第七章习题:输出文件中包含一个大写字母的所有行,不输出一行的内容全是大写的

    文件内容: bash-2.03$ cat file_4_ex_ch7.txt anonymous attribute demolition grammar rules indices refernce ...

  7. scikit-learn - 分类模型的评估 (classification_report)

    使用说明 参数 sklearn.metrics.classification_report(y_true, y_pred, labels=None, target_names=None, sample ...

  8. [Luogu] P3846 [TJOI2007]可爱的质数

    题目描述 给定一个质数P(2<=P<2312^{31}231),以及一个整数B(2<=B<P),一个整数N(2<=N<P). 现在要求你计算一个最小的L,满足BL≡ ...

  9. PHP中设置session过期的时间

    如何严格限制session在30分钟后过期!1.设置客户端cookie的lifetime为30分钟:2.设置session的最大存活周期也为30分钟:3.为每个session值加入时间戳,然后在程序调 ...

  10. js计算最小凸多边形

    最近在做项目的时候遇到一个需求:要求用户可以在地图上绘制多边形,项目中使用的是高德地图,由于无法限制用户绘制的方式,可能出现下图的情况 用户期望的效果如下图所示 本质上,用户希望出现的是凸多边形而不是 ...