PHP框架原理

  本文主要来聊聊框架理论,但不针对任何一款框架,不过任何一款框架都离不开这个理论,首先咱们了解下框架的前因后果,任何技术的出现都是为了解决某个问题,以前的博客有讲过smarty,其存在就是为了html和php更好地分离开来。而所谓的“框架”是一种为了统一书写格式,访问方式而进行的自我约束行为,其实按照这个说法咱们每一个人基本上都或多或少的使用过本身定义的框架,好比说在没使用框架以前本身开发一个项目,有时候是一天没法完成的,咱们为了防止混乱,为了更好地记忆咱们会进行目录规划和程序的规划,潜意识的把程序分类,放到不一样的文件夹,因而框架应运而生了,又好比说咱们曾经作了一个CMS系统,若是咱们又接手一个相似的项目,你会重复书写代码吗,答案确定不会,但若是是别人的项目你拿来改实际上是一件很蛋疼的事情的,由于你根本不知道他的这个CMS的规则是什么,即便是本身的项目时间久了若是本身没有固定的规范的话也是很容易忘记的,那么怎么样才能保证本身每次写的代码均可以按照必定的规范呢,把每一个项目要用的东西挑出来,目录结构挑出来,之后不管什么项目都在这个基础上书写,那么属于本身的框架就出来了。php

  但框架单纯这样是不完善的,那么框架应该有哪些能力呢,与其这样说咱们不妨想一想咱们平时必定会写的代码必定会作的事情是什么呢,首先解决的是什么呢,为了减小路径问题,目录结构的安排其实很重要,有时候文件包含 再进行文件的移动老是一件很蛋疼的事情,最好的办法是什么呢,绝对路径,但同时存在了一个相似E:\www 这样的问题,但这个值咱们能够经过预约义变量$_SERVER["DOCUMENT_ROOT"]得到,咱们能够将其定义为常量,define("ROOT_PATH", $_SERVER["DOCUMENT_ROOT"]);include ROOT_PATH . "/lib/mysql.php";相似这样的文件夹怎么移动都不会有事的,那么就出现了一个固定的写法,为了解决路径问题而存在的写法,几乎每一页都会用到,还有模板的输出,数据库的链接,那么咱们能够把这些代码封装起来,或者分离出来,每一页包含便可,被分离的这些部分其实就是一个小框架,为何这么说呢,若是咱们包含它们进来,例如smarty模板,确定是实例化好的对象,那个量名已经固定,多是$smarty 若是咱们包含了这么个文件进来,这个量就不能再次进行赋值使用,这样下面部分的代码就没法进行使用了,因为包含的类,如数据类 上传类 图像类 分页类 位置已经写死在这个公共文件里,为了避免改代码 这个目录就成了必须存在的了,目录格式固定,编写代码方式的约束,这就造成了框架。 html

  多年来的程序员的总结交流及开发经验,你们总结了一些优秀的编写方式,最经典的是单点入口,什么是单点入口呢,以前咱们总结了一些几乎每一个程序都要用到的功能,这里依然存在一些问题,例如 在公共文件包含以前咱们仍是不知道根目录是多少,若是咱们在每个文件夹下面都放一个公共文件存在代码重复问题,哪天修改的话须要所有修改,须要找到须要多少个这样的文件,如今是多个程序包含一个程序,而后用户访问n个程序来完成各个功能,因而程序员就想可不能够反过来我用一个程序包含这些不一样功能的程序,用户只访问这个程序就能够了呢,因而单点入口模式出现了,在网站首页的 index.php 写上每一个程序都要用的部份 而后跟据某个量,好比一个 get 量来判断当前实际要执行的程序是哪个,由 index.php 把它包含进来运行,这种由一个程序。完成全部功能的方式,称为 单点入口, 因而由这个入口程序和它对应的各个目录结构成为了一个框架。mysql

  出于安全在包含文件的时候每每都会固定目录,否则就容易出漏洞 因此,每每会在路径头尾加个限制。例如程序员


<?PHP
include "./app/" . $_GET['url'] . ".php";
?> 

那路径就只能写成相似这样index.php?url=news/list,实际包含的是 /app/news/list.php 固然了,实际的状况,还要检查一下这个程序文件是否存在之类的。 sql

 完整一点的话。咱们能够这样写这个入口文件。
<?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开发的框架,不外乎就是把主程序改写成为了一个类,

例如:数据库

//包含共用文件,实例化各个类啥的
页面->初始化(); 安全

//把用户发来的网址转成要包含的路径
页面->处理网扯(); 服务器

//在这里包含程序运行
页面->运行()app

//输出模板
页面->输出()框架

各类各样的框架只是为咱们准备了一个规矩罢了。。在咱们的开发累计的过程当中,咱们经常会把一些经常使用的类封装成类,例如,数据库类,文件上传类,图片处理类,邮件收发类,远程访问类,各类接口类……这个时候,咱们就会但愿框架能给咱们提供一个好一点调用类的方法, 也就是所谓的“扩展性” ,好比 TP 框架的 Db 类 。若是不用其自带的类库只用它们的核心框架,其实几个文件就够了。
 TP 框架支持三种访问格式。
/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();
        在这里处理这一页
    }

还能够利用构造函数等,使每个功能,在刚进来的时候就都作了同一件事情。以上就是简单框架的理论。

相关文章
相关标签/搜索