现在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. 424 Longest Repeating Character Replacement 替换后的最长重复字符

    给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次.在执行上述操作后,找到包含重复字母的最长子串的长度.注意:字符串长度 和 k 不会超过 104. ...

  2. 动态添加出来append的元素加事件

    $("body").on("click","#box span",function(){里面执行的东西}) span  是动态添加出来的

  3. net start iisadmin报错:系统找不到指定的文件

    IIS Admin Service不能启动 ,直接启动或命令(net start iisadmin)都不成功.导致IIS站点访问异常. 最终参考网上解决方案: 这是大多是由于windows\syste ...

  4. windows系统同时安装多个nodejs环境(一键切换)

    由于不同程序对nodejs的环境要求不同,从而导致在单台电脑上开发多个nodejs应用很烦人: 好在gnvm,这个家伙帮我解决了问题 官网: https://github.com/kenshin/gn ...

  5. LN : leetcode 343 Integer Break

    lc 343 Integer Break 343 Integer Break Given a positive integer n, break it into the sum of at least ...

  6. mac webstrom 安装less

    1.检验电脑是否安装less lessc -v 2.如果没有执行全局安装命令 npm install -g less 3.webstrom -> Preferencs-> File Wat ...

  7. 针对windowsserver 创建iis站点访问出错的解决方案(HTTP 错误 500.19 - Internal Server Error)

    错误如下:   服务器错误 Internet信息服务 7.0 错误摘要HTTP 错误 500.19 - Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效. 详 ...

  8. OJB

    OJB 编辑 本词条缺少名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! 对象关系桥(OJB)是一种对象关系映射工具,它能够完成从Java对象到关系数据库的透明存储.   英文名 OJB ...

  9. ZooKeeper系列(二)

    Zookeeper的环境配置 一.Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式. 1.单机模式:Zookeeper只运行在一台服务器上,适合测试环境 ...

  10. AttributeError: 'tuple' object has no attribute 'extend'

    出错demo In [5]: a.extend([4,5]) --------------------------------------------------------------------- ...