现在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. php中除法取整的方法(round,ceil,floor)

    PHP中遇到需要将除法所得结果取整的情况时,就需要用到以下方法: 1. round:四舍五入 round() 函数对浮点数进行四舍五入. 语法:round(x, prec) 参数 描述 x 可选.规定 ...

  2. node入门(二)——gulpfile.js初探

    本文关于gulpfile.js怎么写,利于完成个性化需求.本文开发环境默认已安装node,详情参考<node入门(一)——安装>. 一.安装gulp npm install -g gulp ...

  3. 免费大数据搜索引擎 xunsearch 实践

    以前在IBM做后端开发时,也接触过关于缓存技术,当时给了n多文档来学习,后面由于其他紧急的项目,一直没有着手去仔细研究这个技术,即时后来做Commerce的时候,后台用了n多缓存技术,需要build ...

  4. php中 mysql 插入特殊字符(手机端的emoji表情)出现异常

    今天在用mysql存储从微信服务器拉来的数据,出现插入数据异常,报 Incorrect string value: '\xF0\x9F\x98\x97\xF0\x9F 的错误. 最终在网上查了一下,有 ...

  5. 重装系统后,重新搭建Selenium Server+Firefox环境

    摘要:搭建Selenium自动化测试环境其实是非常简单的事情,在态度上我们不要把它当成难事:折腾起来是很愉快的,自然就成功了. 下面把这次安装的过程记录下来,一来是加深印象,二来可以给大家提供参考. ...

  6. php自动加载函数

    含义:将函数注册到SPL __autoload函数栈中.如果该栈中的函数尚未激活,则激活它们. 先看__autoload 函数 printit.class.php <?php class PRI ...

  7. xamarin 学习笔记02- IOS Simulator for windows 安装

    微软发布了在window下的ios模拟器 下载 ios模拟器 并安装在windows系统上. Xamarin for Visual Studio 和 网络上的 Mac 中的 Xamarin.iOS 开 ...

  8. RequireJS 上手使用

    首先 点击此处 得到requirejs. 捣鼓了俩小时终于运行成功了,原因是因为require(['我是空格underscore',...],function(){...})的时候 变量多个空格(坑爹 ...

  9. Regular Expression Flavors

    Perl https://perldoc.perl.org/perlre.html PCRE http://www.pcre.org/current/doc/html/pcre2syntax.html ...

  10. js 代码优化