ThinkPHP教程_PHP框架之ThinkPHP(⼀)【⼊门和介绍、
ThinkPHP版本。。。
⼀、什么是框架
就是别⼈写好的⼀批类和⼀个规则
注意,不仅仅是在学习中,更是在以后的⼯作中,在选择框架的时候,不要⼀味地追求"⼤"、"全",⽽是要根据当时项⽬的需要选择合适的框架
1、MVC模式
M Model 模型 就是数据库操作类(通过数据库操作类去操作各个表)
V View 视图 模板
C Controller控制器 控制器来实现模板、模型之间的控制关系
控制器也是⼀个类,这个类中有不同的⽅法,所以控制器也叫模块(Module),其中的⽅法叫动作(Action)!
那么问题来了,视图是如何告知哪个控制器(模块)去执⾏哪⼀个⽅法(动作)呢?结果是URL
⽐如说在⼀个项⽬中有如下两个模块
⽤户管理 (⽤户注册、⽤户修改、⽤户删除、⽤户编辑)
商品管理 (⽤户下单、修改订单、取消订单)
⼆、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、官⽹:
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⽬录:第三⽅类库
#⽂件:版权声明
·项⽬⽬录结构
项⽬初始化操作,在项⽬⽬录下创建⼀个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);
php手册官方中文版 进⾏该设置后,就不会⽣成核⼼(系统)缓存⽂件了,但是还是会⽣成项⽬(应⽤)编译缓存⽂件,⽽在调试模式下不会⽣成项⽬编译缓存,但是会⽣成核⼼缓存,所以要想既不⽣成核⼼缓存也不⽣成项⽬编译缓存,就要同时开启调试模式和进⾏该设置。在应⽤配置⽂件(应⽤⽬录->Config⽬录->Config.php⽂件)中的数组中添加⼀个元素"APP_DEBUG"=>"True"即可开启调试模式
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论