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目录与缓存CookieSession等等有关  

      ORG目录

      

        Crypt目录与加密有关

        Io目录与目录处理有关

        Net目录与网络处理有关

        Util目录RBACSocket遍历分页等有关

      #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  阅读(20010)  评论(8编辑  收藏  举报

导航