PHP框架原理
但框架单纯这样是不完善的,那么框架应该有哪些能力呢,与其这样说我们不妨想想我们平时一定会写的代码一定会做的事情是什么呢,首先解决的是什么呢,为了减少路径问题,目录结构的安排其实很重要,有时候文件包含 再进行文件的移动总是一件很蛋疼的事情,最好的办法是什么呢,绝对路径,但同时存在了一个类似E:\www 这样的问题,但这个值我们可以通过预定义变量$_SERVER["DOCUMENT_ROOT"]获得,我们可以将其定义为常量,define("ROOT_PATH", $_SERVER["DOCUMENT_ROOT"]);include ROOT_PATH . "/lib/mysql.php";类似这样的文件夹怎么移动都不会有事的,那么就出现了一个固定的写法,为了解决路径问题而存在的写法,几乎每一页都会用到,还有模板的输出,数据库的连接,那么我们可以把这些代码封装起来,或者分离出来,每一页包含即可,被分离的这些部分其实就是一个小框架,为什么这么说呢,如果我们包含它们进来,例如smarty模板,肯定是实例化好的对象,那个量名已经固定,可能是$smarty 如果我们包含了这么个文件进来,这个量就不能再次进行赋值使用,这样下面部分的代码就无法进行使用了,由于包含的类,如数据类 上传类 图像类 分页类 位置已经写死在这个公共文件里,为了不改代码 这个目录就成了必须存在的了,目录格式固定,编写代码方式的约束,这就形成了框架。
多年来的程序员的总结交流及开发经验,大家总结了一些优秀的编写方式,最经典的是单点入口,什么是单点入口呢,之前我们总结了一些几乎每个程序都要用到的功能,这里依然存在一些问题,例如 在公共文件包含之前我们还是不知道根目录是多少,如果我们在每一个文件夹下面都放一个公共文件存在代码重复问题,哪天修改的话需要全部修改,需要找到需要多少个这样的文件,现在是多个程序包含一个程序,然后用户访问n个程序来完成各个功能,于是程序员就想可不可以反过来我用一个程序包含这些不同功能的程序,用户只访问这个程序就可以了呢,于是单点入口模式出现了,在网站首页的 index.php 写上每个程序都要用的部份 然后跟据某个量,比如一个 get 量来判断当前实际要执行的程序是哪一个,由 index.php 把它包含进来运行,这种由一个程序。完成所有功能的方式,称为 单点入口, 于是由这个入口程序和它对应的各个目录结构成为了一个框架。
出于安全在包含文件的时候往往都会固定目录,不然就容易出漏洞 所以,往往会在路径头尾加个限制。例如
PHP include "./app/" . $_GET['url'] . ".php"; ?>
那路径就只能写成类似这样index.php?url=news/list,实际包含的是 /app/news/list.php 当然了,实际的情况,还要检查一下这个程序文件是否存在之类的。
完整一点的话。我们可以这样写这个入口文件。php //这里写绝对路径 //这里写数据库连接 //这里写模板初始化,配置 //这里判断连接变量 //这里包含文件进来运行 //这里输出模板 //这里关闭数据库 ?>一个面向过程的单点入口框架就完成了, 是不是有觉得每次都在地址栏带一个 get 不方便? 那我们可以换一个写法,例如 tp 框架最喜欢用的 http://localhost/index.php/news/list后面的 /news/list 由程序转成 php 路径包含进来就可以了。在 Apache 环境中,这个 /news/list 可以由服务器变量的 PATH_INFO 取得,如果没有的话。也可以用 REQUEST_URI 取得接近的 ,IIS 下面,有 HTTP_X_REWRITE_URL 可以取得这个值 ,自从单点入口模式出现之后,而且oop开发模式从php5开始大行其道,各种oop设计的框架让我们眼花缭乱,但是万变不离其宗,依然是什么入口方式,路径结构是什么样的,文件名的命名规则,用什么样的访问方式,可以运行哪个程序。用oop开发的框架,不外乎就是把主程序改写成为了一个类,
例如:
//包含共用文件,实例化各个类啥的
页面->初始化();
//把用户发来的网址转成要包含的路径
页面->处理网扯();
//在这里包含程序运行
页面->运行()
//输出模板
页面->输出()
/news/list
/index.php/news/list
/index.php?m=news&a=list 第一种需要服务器的 urlrewrite 支持,后面两种可以直接用, 事实上,Zend 框架也差不多 文件的包含方式是。以类的形式包含,执行的其实是:/文件夹/对象/方法,这种做法有优势。因为在同一个功能中,相似的代码很多,封装到同一个类里面,可以更高效的重复使用代码 ,
比如这样 class NewsAction { public function head() { 在这里处理每一页头部 } public function index() { $this->head(); 在这里处理这一页 } public function show() { $this->head(); 在这里处理这一页 }
还可以利用构造函数等,使每一个功能,在刚进来的时候就都做了同一件事情。以上就是简单框架的理论。
下一篇: JavaBean和Map转换封装类的方法