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主题文件,一般由一个复杂的名字,不过不用担心就是机器随机生成的一个码而 ...
随机推荐
- E. Dasha and Puzzle 数学题
http://codeforces.com/contest/761/problem/E 给出一颗树,要求在坐标系中用平行于坐标轴的线描绘出来. 要求边不能相交,而且点的坐标唯一. 注意到2^1 + 2 ...
- C#代码规范(简版)
C#项目代码规范 目的 1.方便代码的交流和维护. 2.不影响编码的效率,不与大众习惯冲突. 3.使代码更美观.阅读更方便. 4.使代码的逻辑更清晰.更易于理解. 在C#中通常使用的两种编码方式如下 ...
- Android SpannableString及字体设置
import android.content.Context; import android.graphics.Color; import android.text.SpannableString; ...
- Apache Tomcat 之路(一 基本概念)
关于apache tomcat 基本概念(https://tomcat.apache.org/tomcat-7.0-doc/index.html) 1.tomcat 是servlet/jsp 容器,对 ...
- MSSQL 重新生成索引,重新组织索引
> 5% 且 < = 30% ALTER INDEX REORGANIZE > 30% ALTER INDEX REBUILD WITH (ONLINE = ON)* * 重新生成索 ...
- github修改仓库项目的语言类型
github是 采用Linguist来自动识别你的代码应该归为哪一类. 解决方法: 我们可以在仓库的根目录下添加.gitattributes文件: ## 使用 `.gitattributes` 配置文 ...
- (转)淘淘商城系列——SSM框架整合之Dao层整合
http://blog.csdn.net/yerenyuan_pku/article/details/72721093 一个项目中往往有三层即Dao层.Service层和Web层,看标题就知道了,本文 ...
- 在Swift中定义属于自己的运算符
precedencegroup ChainingPrecedence { associativity: left higherThan: TernaryPrecedence } infix opera ...
- $("[lay-id='"+this.id+"']")
$("[lay-id='"+this.id+"']") $("[lay-id='"+this.id+"'] .layui-tabl ...
- CAD参数绘制椭圆(网页版)
在CAD设计时,需要绘制椭圆,用户可以设置椭圆的基本属性. 主要用到函数说明: _DMxDrawX::DrawEllipse 绘制椭圆.详细说明如下: 参数 说明 DOUBLE dCenterX 椭圆 ...