ThinkPHP教程_PHP框架之ThinkPHP(一)【入门和介绍、ThinkPHP版本和文件夹规范、项目入口文件】
一、什么是框架
就是别人写好的一批类和一个规则
注意,不仅仅是在学习中,更是在以后的工作中,在选择框架的时候,不要一味地追求"大"、"全",而是要根据当时项目的需要选择合适的框架
1、MVC模式
M Model 模型 就是数据库操作类(通过数据库操作类去操作各个表)
V View 视图 模板
C Controller控制器 控制器来实现模板、模型之间的控制关系
控制器也是一个类,这个类中有不同的方法,所以控制器也叫模块(Module),其中的方法叫动作(Action)!
那么问题来了,视图是如何告知哪个控制器(模块)去执行哪一个方法(动作)呢?结果是URL
比如说在一个项目中有如下两个模块
用户管理 (用户注册、用户修改、用户删除、用户编辑)
商品管理 (用户下单、修改订单、取消订单)
那么就得分为两个控制器,一个是用户管理控制器、另一个是商品管理控制器!然后通过URL去告知相应的控制器去执行相应的方法,比如说http://localhost/index.php?m=user&a=reg就表示告知用户管理控制器(模块)去执行用户注册方法(动作).PS,URL中的m表示Module,a表示Action;index.php叫做主入口文件,注意,所有文件加载都以主入口为准,也就是说必须通过主入口文件去告知某某控制器去执行某某方法!
二、ThinkPHP框架
1、具有比较好的跨平台性
无论是服务器平台(Linux、Windows、Unix)还是服务器软件(Apache、IIS、Nginx),都能良好的支持
2、文件名大小写问题
Windows中的文件名是不区分大小写的,而Linux和Unix中的文件名是区分大小写的!那么就可能在平台移植过程中,出现文件找不到的情况,而ThinkPHP很好的解决了这个问题,只要在ThinkPHP中开启了APP_DEBUG,即调试模式,那么即使在Windows下开发,ThinkPHP就已经严格区分了大小,这就从源头上解决了平台移植大小写的问题!
3、URL支持多种模式
共有4种模式,方便SEO
4、支持自动加载、动态编译
节约系统开销
5、AJAX支持、视图、分组、权限管理、关联操作、主从数据库、缓存(apc、db、memcache、shmop、xcache、file)
6、自动验证、自动完成、映射
7、加载第三方类库
三、ThinkPHP版本和文件夹规范
1、官网:www.thinkPHP.cn
2、软件开发阶段
A alpha 内部测试
B beta 公开测试
C RC 开发倒计时(该阶段已经将重大和重要的BUG进行了修复,仅仅会有一些小的使用性上面的小bug)
D final 正式发行版本
3、ThinkPHP版本
基础阶段学习的是2.1RC版(目前(2016-08-18)在官网上已经没有2.1RC版了,只有2.1正式版),所以使用的是2.1正式版
ThinkPHP有核心包和完整包之分,完全开发手册有PDF、swf、CHM版,还有ThinkPHP的API手册
核心包 仅仅包含ThinkPHP运行的最主要文件(不包含扩展类、示例、文档)(ThinkPHP_2.1_core.zip)
完整包 核心包的基础上增加了扩展类、示例、文档
ps,其实2.x版本的完整包是有带示例和文档完整包(ThinkPHP_2.1_full.zip)和带扩展、示例和文档完整包(ThinkPHP_2.1_full_with_extend.zip)之分的,但是在3.x以及5.x版本中,完整包就没有分两种了(统一叫ThinkPHP_3.1.3_full.zip)
注意,核心包仅仅只有一个ThinkPHP的核心目录,而且完整包和核心包的ThinkPHP目录也是不一样的!完整包的ThinkPHP目录中的Vender目录下是有很多扩展类的,而核心包的ThinkPHP目录中的Vender目录是空的;完整包的ThinkPHP目录中的Lib目录下是有一ORG目录的,而核心包是没有的!
文档下载
4、文件夹规范
ThinkPHP的文件夹规范分两大块,一个是系统目录结构、一个是项目目录结构
·系统目录结构
#ThinkPHP.php文件:项目初始化时,单一入口文件必须引入的一个文件,因为系统目录必须通过这个文件查找
#Common目录:一些公用的函数,比如说D()、F()等等;其中的convention.php包含ThinkPHP中所有的配置文件需要用到的东西等等
#Lang目录:语言包,就是将ThinkPHP可能产生的一些错误和异常与对应的文字说明做一个映射。而文字说明可以是中文、英文或其它语言,如果是中文就是中文包,英文就是英文包等等
#Lib目录:包含如下两个目录
Think目录
Db目录中的Driver目录就相当于数据库抽象层,它屏蔽了连接不同数据库的不同方法,统一为一个名称。可以直接编写一个数据库连接类,比如说DbMongo.class.php,但是一定要注意命名规范!
Exception目录中是异常处理类
Template目录中是模板解析类。这里讨论一个问题,就是在ThinkPHP中是使用Vendor目录中加载的第三方类库(比如说Smarty)来进行模板解析,还是使用ThinkPHP自带的类库?答案是,推荐使用ThinkPHP自带的类库进行模板解析,原因有两个(1、兼容性更好 2、模板引擎和标签处理是XML方式的,处理效率更高)
Util目录与缓存、Cookie、Session等等有关
ORG目录
Crypt目录与加密有关
Io目录与目录处理有关
Net目录与网络处理有关
Util目录RBAC、Socket、遍历、分页等有关
#Model目录:框架模式扩展目录
#Tpl目录:系统处理模板目录
#Vendor目录:第三方类库
#LICENSE.txt文件:版权声明
·项目目录结构
项目初始化操作,在项目目录下创建一个index.php(文件名随意,最好与项目中的子项目名相同,比如说项目前台用index.php、项目后台用admin.php,这就是单一入口文件。一般来说,一个项目都有两个子项目,即前台子项目和后台子项目,但是如果用了项目分组的话,一个子项目就是一个分组,所以就没有子项目了,也就只有一个单入口文件。ps,单一入口文件名一般小写,而项目名首字母要大写),并写如下代码,再访问即可!
#Common目录:自己写的公用函数目录
#Config目录:配置文件目录
#Lang目录:作用同系统目录结构中的Lang目录
#Lib目录:分为如下两个目录,通常还有第三个目录Org,该目录在项目初始化的过程中是不会自动生成的,可以手动创建
Action目录:控制器目录
Model目录:模型目录,即自定义数据库类
Org目录:扩展类,可以直接将系统目录中的ORG目录下的扩展类Copy过来用,也可以自己写一些扩展类
#Runtime目录:
Cache目录:编译出来的页面(即编译后模板)
Data目录:与表相关的数据
Logs目录:错误日志、运行日志
Temp目录:文件缓存
~app.php文件和~runtime.php文件都是系统生成的核心编译文件
#Tpl目录:Tpl目录下,一个目录就是一套皮肤,默认有一个default目录
四、项目主入口文件
1、THINK_PATH
定义框架路径,说的简单点就是将ThinkPHP这个核心目录相对于入口文件的相对路径定义给一个常量,方便书写且不容易写错,在以后要用到"./ThinkPHP/"地方用THINK_PATH代替之
define("THINK_PATH","./ThinkPHP");还有一个作用就是防跳墙!所谓防跳墙就是防止用户直接去访问敏感文件,通常做法是用一个非敏感页面去包含这个敏感页面,并且在非敏感页面做一些安全方面的策略,比如说进行验证,验证通过才允许访问其中的敏感页面!这实际上与通过一个public方法去访问一个private属性是一个道理的!
2、APP_PATH
准确的说应该叫做应用路径(APP->Application),而并非项目路径,虽然叫项目路径也没错,但是总是有些歧义!
·项目应该叫Project,这就是我们所开发的整个项目,ThinkPHP核心目录就是在项目下一级目录中
·应用即Application,这是我们所开发的整个项目中的一个个应用,比如说通常一个项目会有前台应用和后台应用,那么就可以在这个项目的下一级目录中创建两个入口文件(说明一下,在没有进行分组时,单一入口文件的这个单一是针对应用来说的,所以如果有两个应用就需要两个入口文件),来分别创建这两个应用,即两个目录(与ThinkPHP核心目录平级)
3、APP_NAME
·让ThinkPHP在进行加载的时候更好的区分不同的应用
·便于以后在做权限管理(RBAC)的时候,能够更好的区分前台应用和后台应用的权限
4、引入"ThinkPHP.php"
注意,不要太纠结到底是哪个(include/include_once/require/require_once),重点是把"ThinkPHP.php"这个整个框架的入口文件引入!
5、APP::run();
用APP类的静态方法run()创建一个应用,并不是非得通过APP来调用这个静态方法,也可以$app=new APP;$app->run();这样通过一个APP对象来调用run()实现创建一个应用的操作
五、ThinkPHP的项目编译机制
项目编译机制的两个主要文件,~runtime.php(核心缓存文件)和~app.php(项目编译缓存文件) ps,注意一下设置都是在入口文件中进行的
对于项目编译机制的理解,就是在第一次执行的时候,将执行所需要的部分系统代码和项目代码拎出来分别放到~runtime.php和~app.php中,那么在以后的执行中,直接执行~runtime.php和~app.php中的代码,而不必向第一次执行那样,需要去操作系统目录和项目目录中文件,从而节省了大量的I/O开销,那么项目的运行速度会有明显的提升!而且ThinkPHP对~runtime.php和~app.php文件本身做了一定优化,即将这两个文件中的注释、空格、换行等等一些无关代码执行的字符去掉了,从而使得文件更小,执行更加有效率!但是这并不利于程序员调试,因为这个代码就一行你怎么调试,所以要用define("STRIP_RUNTIME_SPACE",false)加上这些注释、空格、换行等等字符,便于程序员阅读代码!
~runtime.php中的代码是由系统目录中的core.php文件决定的
~app.php文件通常包含项目配置文件(包括惯例配置(可以理解为默认配置)和项目配置(自定义配置),自定义配置优先级高于默认配置)、项目公用函数文件(common.php)
1、在测试define('STRIP_RUNTIME_SPACE',false);发现的几个问题
·如果不删除Runtime目录,则它是不生效的,因为入口文件在创建整个应用目录的时候,如果发现要创建的目录存在,它是不会修改这个存在的目录的!
·无法直接删除应用目录(即使提供了系统管理员权限也不行,不知道咋地),但是可以删除应用目下的任何一个子目录
·这条语句必须是放在引入"ThinkPHP.php"的操作之前,否则是不起作用的!实际上,这对入口文件中的所有语句都适用
·这条语句对~app.php不起作用
2、define("RUNTIME_PATH",APP_PATH."xxx/");
可以修改RUNTIME目录的,不过即使是修改RUMTIME目录,也要是在应用目录下,所以最好用APP_PATH拼一下
3、define("NO_CACHE_RUNTIME",True);
进行该设置后,就不会生成核心(系统)缓存文件了,但是还是会生成项目(应用)编译缓存文件,而在调试模式下不会生成项目编译缓存,但是会生成核心缓存,所以要想既不生成核心缓存也不生成项目编译缓存,就要同时开启调试模式和进行该设置。在应用配置文件(应用目录->Config目录->Config.php文件)中的数组中添加一个元素"APP_DEBUG"=>"True"即可开启调试模式
posted on 2016-08-19 09:41 Yang24556 阅读(20247) 评论(8) 编辑 收藏 举报