ThinkPHP框架
ThinkPHP是为了简化企业级应用开发和敏捷WEB应用开发而诞生的。最早诞生于2006年初,2007年元旦正式更名为ThinkPHP,并且遵循Apache2开源协议发布。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进。[1]
ThinkPHP是一个快速、兼容而且简单的轻量级国产PHP开发框架,诞生于2006年初,原名FCS,2007年元旦正式更名为ThinkPHP,遵循Apache2开源协议发布,从Struts结构移植过来并做了改进和完善,同时也借鉴了国外很多优秀的框架和模式,使用面向对象的开发结构和MVC模式,融合了Struts的思想和TagLib(标签库)、RoR的ORM映射和ActiveRecord模式。
- 外文名
- ThinkPHP
- 定 义
- 一个开源轻量级PHP框架
- 原 名
- FCS
- 诞 生
- 于2006年初
ThinkPHP发展历程,无数TPer一起见证了ThinkPHP的成长:
2006年01月15日, ThinkPHP的雏形版本FCS0.6.0发布;
2006年02月12日,(元宵节)发布FCS 0.6.
1 版本,Google讨论组成立;
2006年03月15日, FCS 0.7.0版本发布;
2006年05月07日, FCS 0.8版本发布;
2006年10月25日, FCS 0.9.0版本发布;
2006年12月25 日,SF项目和Google网站ThinkPHP项目申请完成;
2007年01月01日, FCS正式更名为ThinkPHP;
2007年01月08日, ThinkPHP 0.9.5版发布同期官方网站开通;
2007年02月21日, TOPThink社区暨新版ThinkPHP官方网站开通,并提供社区支持;
2007年02月25日, 发布ThinkPHP 0.9.6版本,完成FCS到ThinkPHP的正式迁移;
2007年04月29日, ThinkPHP发布0.9.7版本;
2007年07月01日, ThinkPHP发布0.9.8版本;
2007年10月15 日,ThinkPHP发布1.0.0RC1版本,完成PHP5的重构;
2007年12月15 日,ThinkPHP发布1.0.0正式版本标志着ThinkPHP步入轨道;
2008年10月01日, ThinkPHP发布1.0.3正式版本;
2008年12月25 日,ThinkPHP发布1.5正式版本并启动商业化支持服务,ThinkPHP进入稳定发展;
2009年05月01日, ThinkPHP 发布1.6.0RC1版本;
2009年10月01日, ThinkPHP发布2.0版本完成新的重构和飞跃,这是一次划时代的版本;
2012年04月05日, ThinkPHP发布3.0版本 庆祝ThinkPHP发布6周年;
2012年10月08日, ThinkPHP发布3.1版本;
2012年11月11日, ThinkPHP3.1.2扩展包;
2013年05月09日,ThinkPHP发布3.1.3完整版;
2013年12月18日,ThinkPHP发布3.2正式版;
2015年12月11日,ThinkPHP 5.0 Beta 发布;
简单易用
模型(M):模型的定义由Model类来完成。Model类位于项目目录下面的LibModel目录。
控制器(C):应用控制器(核心控制器)和Action控制器都承担了控制器的角色,区别在于Action控制器完成业务过程,而应用控制器(App类)负责调度控制。Action控制器位于项目目录下面的LibAction目录。
视图(V):模板的实现是和框架无关的,做到了100%分离,可以独立预览和制作。模板目录位于项目目录下面的Tpl目录。
独创机制
1)支持XML标签库和普通标签的混合定义;
2)编译一次,下次直接运行而无需重新编译;
3)模板文件更新后,自动更新模板缓存;
4)自动加载当前操作的模板缓存文件,无需指定模板文件名称;
5)支持编码转换和Content-Type更换;
7)模板常量替换,无需设置模板变量;
8)支持变量组合调节器和格式化功能;
10)支持获取模板页面内容。
富模型支持
1)聚合模型:
聚合模型是一种虚拟模型,用于把数据表的字段抽象化,更加容易理解和操作。
我们可以把数据表中的某些属性进行数据封装,这样就把枯燥的数据表字段赋予更好的可读性。
2)静态模型:
静态模型可以让模型的数据静态化,而不需要频繁和数据库打交道,可以用于不经常改变的数据表。而且ThinkPHP在ORM层上面模拟实现了数据库的视图功能,这是ThinkPHP独创的一项技术,使得多表的关联查询具有更高的效率和可操作性,而无需定义复杂的关联关系,让关联关系更加浅显易懂。
有些时候,数据表的数据一旦添加后就不再容易变化,我们更希望把这样的模型数据静态化,而不需要再次访问数据库。ThinkPHP支持静态模型的概念,一旦把模型设置为静态,那么会在第一次初始化的时候获取数据表的全部数据,并生成缓存,以后不会再连接数据库。而只需要直接访问模型的dataList数据即可。
3)视图模型
ThinkPHP在ORM模型里面模拟实现了数据库的视图模型,该功能可以用于多表查询。
要定义视图对象,需要设置viewModel为true,然后设置viewFields属性即可。
CURD和操作高度自动化支持
ThinkPHP提供了灵活和方便的数据操作方法,不仅实现了对数据库操作的四大基本操作(CURD):创建、读取、更新和删除的实现,还内置了很多实用的数据操作方法,提供了ActiveRecords模式的最佳体验。
丰富的查询语言支持
ThinkPHP大多数情况使用的都是对象查询,因为充分利用了ORM查询语言,了解查询条件的定义对使用对象查询非常有帮助,对于复杂的查询,或者从安全方面考虑,可以使用HashMap对象或者索引数组来传递查询条件。
目录结构自动创建THINKPHP目录结构
ThinkPHP具有项目目录自动创建功能,你只需要定义好项目的入口文件,第一次执行入口文件的时候,系统会自动创建项目的相关目录结构,如果是linux环境下面需要给项目入口文件里面指定的路径设置可写权限。
分布式数据库支持
ThinkPHP的模型支持主从式数据库的连接,配置DB_DEPLOY_TYPE为1可以采用分布式数据库支持。
多数据库连接和切换支持
如果需要在特殊的时候连接多个数据库,那么可以尝试使用ThinkPHP的多数据库连接特性:包括相同类型的数据库和不同类型的数据库。(注意:所谓的相同类型数据库的定义是指和项目配置文件或者模型的数据库连接的数据库类型相同。)
ActiveRecords模式和丰富的ROR特性
ThinkPHP实现了ActiveRecords模式的ORM模型,采用了非标准的ORM模型:表映射到类,记录(集)映射到对象,字段属性映射到对象的虚拟属性。最大的特点就是使用方便,从而达到敏捷开发的目的。
灵活简单的项目配置
ThinkPHP提供了灵活的配置功能,采用最有效率的PHP返回数组方式定义,支持惯例配置、项目配置、调试配置和模块配置,并且会自动生成配置缓存文件,无需重复解析的开销。对于有些简单的应用,你无需配置任何配置文件,而对于复杂的要求,你还可以增加模块配置文件,另外ThinkPHP的动态配置使得你在开发过程中可以灵活的调整配置参数。
ThinkPHP在项目配置上面创造了自己独有的分层配置模式,其配置层次体现在:惯例配置-->项目配置-->模块配置-->操作(动态)配置,优先顺序从右到左(在没有生效的前提下)。
模型自动验证和处理
系统内置了数据对象的自动验证功能,而大多数情况下面,数据对象是由表单提交的$_POST数据创建。需要使用系统的自动验证功能,只需要在Model类里面定义$_validate属性,是由多个验证因子组成的数组,支持的验证因子格式:验证字段,验证规则,错误提示,验证条件,附加规则,验证时间。
静态页面生成和多元化缓存机制
ThinkPHP内置了静态缓存的功能,并且支持静态缓存的规则定义。要使用静态缓存功能,需要开启HTML_CACHE_ON参数,并且在项目配置目录下面增加静态缓存规则文件htmls.php。
丰富的数据库及PDO支持
AJAX支持
易扩展的系统基类库
系统基类库
ThinkPHP框架通过基类库的概念把所有系统类库都集成在一起,包括ThinkPHP的核心类库。
基类库分成Think核心类库、ORG扩展类库,在这主要介绍的是核心基类库,核心基类库的作用是完成框架的通用性开发而必须的基础类和常用工具类等,包含有:
Think.Core 核心类库包
Think.Db 数据库类库包
Think.Util 系统工具类库包
Think.Template 内置模板引擎类库包
Think.Exception 异常处理类库包函数库
ThinkPHP内置了一个系统公共函数库,提供了一些系统需要的函数,系统函数库位于ThinkPHP的Common目录下面,名称为functions.php。
每个项目可以定义自己的函数库,位于项目的Common目录下面的common.php文件。
如果项目在Common目录下面有定义自己的common.php文件,框架会在初始化的时候自动导入,而无需自己导入。
匹配导入
Import方法是ThinkPHP内建的类库和文件导入方法,提供了方便和灵活的类似于命名空间的文件导入机制。
自动编码转换
ThinkPHP框架的文件全部采用UTF-8编码格式,UTF-8的支持和自动输出编码转换的功能让页面表现更加灵活。您可以配置输出的页面编码格式,如gb2312等(默认采用UTF-8输出)。系统根据配置文件中设置的编码格式自动对页面进行编码转换,支持iconv和mb_string两种方式,为了提高效率,如果系统的模板编码设置和输出编码设置项相同,则不会进行编码转换。ThinkPHP可以设置模板编码、输出编码和数据库编码,并自动完成转换工作,让你的应用不再受编码的苦恼。
要掌握ThinkPHP,首先要了解其中的几个重要概念,对于熟悉Java开发的朋友,应该很容易理解下面的一些概念。
Action对象
和Struts框架的Action类似,Action对象主要提供应用逻辑的控制和处理,属于ThinkPHP的控制层,由核心的App类完成模块和操作的解析后直接转交给相应的Action对象处理。应用类中的所有Action对象都继承系统的Action基类。
Dao对象
是指DataAccessObject(数据访问对象),Dao设计模式把底层的数据访问逻辑和业务逻辑分开,夹在业务层与数据层中间,用于数据库访问和操作。可以针对单表和多表操作。ThinkPHP中的Dao对象属于建立在抽象数据库访问层之上的事务性对象。
VO对象
是指ValueObject(数据对象),更加精确的说是业务对象,因为VO对象是存活在业务层的,供业务逻辑使用的。VO对象和数据表存在一种映射关系,VO对象的每个属性对应数据表(或者视图)的一个字段,你完全可以添加其他非数据表字段的VO对象属性,以用于业务逻辑操作,例如关联字段。VO对象有个特殊的保留属性_info,是一个数组变量,用来保存该VO对象的一些特殊信息。和VO对象对应的概念还有PO(持久数据对象),VO和PO的概念都来自于O/RMapping(ObjectRelationalMapping,对象关系映射),PO只能用在数据层(也就是说PO对象的属性必须和数据表一一对应),VO用在业务逻辑层和表示层(可以有自己的额外属性)。各层操作属于该层自己的数据对象,这样就可以降低各层之间的耦合,便于以后系统的维护和扩展。如果将PO用在各个层中就相当于我们使用全局变量,我们知道在OO设计非常不赞成使用全局变量。
VoList对象
在ThinkPHP框架中,把查询后的数据集(ResultSet)转换成数据列表对象,也就是VOLIST对象,和ResultSet对象不同的是每个记录就相当于一个VO对象。在VOLIST对象中可以方便地遍历和操作VO对象。VO对象和VOLIST对象都属于ThinkPHP框架中的实体对象,是数据操作的基本元素。如果你在开发过程中没有使用Dao模式,而是通过数据库驱动类直接操作数据库,那么返回的是ResultSet对象。ThinkPHP系统提供了从ResultSet对象转换为VOLIST对象的方法。
组件和插件支持
基于角色的权限控制体系
企业级的应用是离不开安全保护的,ThinkPHP以基于Spring的Acegi安全系统作为参考原型,并做了简化,以适合目前的ThinkPHP结构,提供了一个多层的、可定制的安全体系来为应用开发提供安全控制。安全体系中主要有: 安全拦截器、认证管理器、决策访问管理器 、运行身份管理器。
ThinkPHP的分层架构采用三层架构模式:
表现层
业务层
包含业务接口层、业务逻辑层、实体层、数据访问层Action控制器作为业务接口层,提供系统各种业务操作的入口。因此,不提倡在控制器类中写过多的业务逻辑代码,虽然说很难严格控制。具体的业务逻辑应该封装到数据访问对象(Dao)类中实现,如果觉得过于复杂,还可以把子业务在Helper类中包装后统一调用。业务处理过程一般会构造出业务实体对象(如Vo对象),对业务实体对象的存取通过数据访问层完成。数据访问层把实体对象和数据库数据之间建立映射关系,并且封装了通用的数据操作。
数据层
支持的数据库有MySql、MsSql、PgSql、Oracle、Sqlite,最新版本已经提供PDO的支持,数据库的选用和业务逻辑没有关系。
主要特性包括:
--------------------------------------------------------------
规范:遵循PSR-2、PSR-4规范,Composer及单元测试支持;
严谨:异常严谨的错误检测和安全机制,详细的日志信息,为你的开发保驾护航;
灵活:减少核心依赖,扩展更灵活、方便,支持命令行指令扩展;
API友好:出色的性能和REST支持、远程调试,更好的支持API开发;
高效:惰性加载,及路由、配置和自动加载的缓存机制;
ORM:重构的数据库、模型及关联,MongoDb支持;
--------------------------------------------------------------
严谨:异常严谨的错误检测和安全机制,详细的日志信息,为你的开发保驾护航;
灵活:减少核心依赖,扩展更灵活、方便,支持命令行指令扩展;
API友好:出色的性能和REST支持、远程调试,更好的支持API开发;
高效:惰性加载,及路由、配置和自动加载的缓存机制;
ORM:重构的数据库、模型及关联,MongoDb支持;
--------------------------------------------------------------
相对于RC4版本,主要更新如下:
请求和路由:
-
Request对象支持动态绑定属性
-
定义了路由规则的URL原地址禁止访问
-
改进路由规则存储结构
-
路由分组功能增强,支持嵌套和虚拟分组
-
路由URL高效反解
-
改进Request对象param方法获取优先级
-
路由增加name方法设置和获取路由标识
-
增加MISS和AUTO路由规则
-
Route类增加auto方法 支持注册一个自动解析URL的路由
-
路由规则支持模型绑定
-
路由变量统一使用param方法获取
-
路由规则标识功能和自动标识
-
增加生成路由缓存指令 optimize:route
-
Request对象增加route方法单独获取路由变量
-
Request对象的param get post put request delete server cookie env方法的第一个参数传入false 则表示获取原始数据 不进行过滤
-
改进自动路由标识生成 支持不同的路由规则 指向同一个路由标识,改进Url自动生成对路由标识的支持
-
改进Request类 filter属性的初始化
-
改进Request类的isAjax和isPjax方法
-
Request类增加token方法
-
路由配置文件支持多个 使用 route_config_file 配置参数配置
-
域名绑定支持https检测
-
改进域名绑定 支持同时绑定模块和其他 支持绑定到数组定义的路由规则,取消域名绑定到分组
-
路由规则增加PATCH请求类型支持
-
增加route_complete_match配置参数设置全局路由规则定义是否采用完整匹配 可以由路由规则的参数complete_match 进行覆盖
-
改进路由的 后缀参数识别 优先于系统的伪静态后缀参数
-
Url类增加root方法用于指定当前root地址(不含域名)
-
改进Url生成对可选参数的支持
数据库:
-
查询条件自动参数绑定
-
改进分页方法支持参数绑定
-
Query类的cache方法增加缓存标签参数
-
Query类的update和delete方法支持调用cache方法 会自动清除指定key的缓存 配合查询方法的cache方法一起使用
-
改进Query类的延迟写入方法
-
Query类的column和value方法支持fetchsql
-
改进日期查询方法
-
改进存储过程方法exec的支持
-
改进Connection类的getLastInsID方法获取
-
记录数据库的连接日志(连接时间和DSN)
-
改进Query类的select方法的返回结果集判断
-
Connection类增加getNumRows方法
-
数据库事务方法取消返回值
-
改进Query类的chunk方法对主键的获取
-
改进当数据库驱动类型使用完整命名空间的时候 Query类的builder方法的问题
模型:
-
增加软删除功能
-
关联模型和预载入改进
-
关联预载入查询闭包支持更多的连贯操作
-
完善savell方法支持更新和验证
-
关联定义统一返回Relation类
-
Model类的has和hasWhere方法对join类型的支持
-
Model类的data方法 批量赋值数据的时候 清空原始数据
-
Model类的get方法第三个参数传入true的时候会自动更新缓存
-
Model类增加只读字段支持
-
Model类增加useGlobalScope方法设置是否启用全局查询范围
-
Model类的base方法改为静态定义 全局多次调用有效
-
Model类支持设定主键、字段信息和字段类型,不依赖自动获取,提高性能
-
Model类的data方法 支持修改器
-
改进Relation类对非数字类型主键的支持
-
改进Relation类的一对多删除
日志和缓存:
-
支持日志类型分离存储
-
日志允许设置记录级别
-
增加缓存标签功能
-
缓存类增加pull方法用于获取并删除
-
cache助手函数增加tag参数
-
简化日志信息,隐藏数据库密码
-
增加cache/session redis驱动的库选择逻辑;
-
memcached驱动的配置参数支持option参数
-
调试模式下面 日志记录增加页面的header和param参数记录
-
memcached缓存驱动增加连接账号密码参数
-
缓存支持设置complex类型 支持配置多种缓存并用store切换
-
缓存类增加tag方法 用于缓存标签设置 clear方法支持清除某个缓存标签的数据
-
File类型日志驱动支持设置单独文件记录不同的日志级别
-
改进文件缓存和日志的存储文件名命名规范
-
缓存类增加inc和dec方法 针对数值型数据提供自增和自减操作
-
Cache类增加has方法 get方法支持默认值
其他:
-
视图类支持设置模板引擎参数
-
增加表单令牌生成和验证
-
增加中文验证规则
-
增加image和文件相关验证规则
-
重定向Response对象支持with方法隐含传参
-
改进Session类自动初始化
-
session类增加pull方法用于获取并删除
-
增加Env类用于获取环境变量
-
Request类get/post/put等更改赋值后param方法依然有效
-
改进Jump跳转地址支持Url::build 解析
-
优化Hook类
-
应用调试模式和页面trace支持环境变量设置
-
config助手函数支持 config('?name') 用法
-
支持使用BIND_MODULE常量的方式绑定模块
-
入口文件自动绑定模块功能
-
改进验证异常类的错误信息和模板输出,支持批量验证的错误信息抛出
-
完善console 增加output一些常用的方法
-
增加token助手函数 用于在页面快速显示令牌
-
增加halt方法用于变量调试并中断输出
-
改进Validate类的number验证规则 和 integer区分开
-
optimize:autoload增加对extend扩展目录的扫描
-
改进Validate类的boolean验证规则 支持表单数据
-
改进cookie助手函数支持 判断是否存在某个cookie值
-
改进abort助手函数 支持抛出HttpResponseException异常
-
改进File类增加对上传错误的处理
-
改进File类move方法的返回对象增加上传表单信息,增加获取文件散列值的方法
-
改进File类的move方法的返回对象改为返回File对象实例
-
增加clear和optimize:config 指令
-
改进File类和Validate类的图像文件类型验证
-
控制器的操作方法支持注入Request之外的对象实例
-
Request类 param(true) 支持获取带文件的数据
-
input助手函数第一个参数增加默认值
-
Validate类增加image验证规则 并改进max min length支持多种数据类型
-
json输出时数据编码失败后抛出异常
调整:
-
废除路由映射(静态路由)定义
-
取消url_deny_suffix配置 改由路由的deny_ext参数设置
-
模型save方法返回值改为影响的记录数,取消getId参数
-
Request对象controller方法返回驼峰控制器名
-
控制器前置操作方法不存在则抛出异常
-
Loader类db方法增加name标识参数
-
db助手函数增加第三个参数用于指定连接标识
-
Sqlsrv驱动默认不对数据表字段进行小写转换
-
移除sae驱动 改为扩展包
-
Oracle驱动移出核心包
-
Firebird驱动移出核心包
-
取消别名定义文件alias.php
-
配置参数读取的时候取消环境变量判断 需要读取环境变量的时候使用Env类
-
环境变量定义文件更改为 .env 由原来的PHP数组改为ini格式定义(支持数组方式)
-
状态配置和扩展配置的加载顺序调整 便于状态配置文件中可以更改扩展配置的参数
-
取消域名绑定到路由分组功能
-
控制器类的success和error方法url参数支持传入空字符串,则不做任何处理
-
控制器的error success result redirect方法均不需要使用return
-
创建目录的权限修改为0644
TinkPHP 3.2.2发布 2014/4/15
ThinkPHP3.2.2版本在修正一些BUG后,重写了模块的自动生成,并支持控制器和模型的批量生成,增加了配置文件多格式支持,以及一些小的细节改进,该版本属于小版本更新。
1、应用支持包括PHP/JSON/INI/XML/YAML以及自定义格式的配置文件;
2、支持模块的自动生成和控制器/模型的批量生成;
3、增加插件控制器的访问支持;
4、cookie函数增加httponly参数支持;
5、改进模型类的安全处理;
6、修正了3.2.1发布以来社区反馈的一些BUG(详见更新日志);
TinkPHP3.2.1发布 2014/2/14
相对于3.2.0版本,主要更新如下:
-
性能较比3.2.0版本提升30%;
-
应用模块中的类库可以配置不使用命名空间;
-
支持运行时Lite文件生成,用于替换应用入口文件;
-
改进路由定义的闭包支持;
-
增加API应用模式,更加高效;
-
增加REST、RPC、HPROSE和YAR控制器扩展支持;
-
增加REPL行为扩展,增强框架开发的调试手段;
-
重写查询缓存功能;
-
语言定义支持变量传入;
-
C函数获取配置参数支持默认值;
-
支持操作方法绑定到类;
-
改进和修正Image、Verify和Upload类;
-
修正了3.2.0发布以来社区反馈的一些BUG;
TinkPHP3.2发布 2013/12/18
这次版本的关键词是模块化、驱动化和云平台。
模块化:3.2版本的架构专门为模块化设计做了优化和调整,从而更适合企业级应用,当然这很大一部分得益于对命名空间的支持以及自动加载机制。同时,你会看到一个小的细节,ThinkPHP3.2版本自带了一个应用入口文件和应用目录。
驱动化:3.2版本在设计类库的时候尽量采用驱动式设计,对于同一功能在不同环境和类型的操作只需要配置驱动即可轻松移植,不需要改变现有代码,同时也让你的应用能够适用于更多更复杂的运行环境。
云平台:3.2版本在底层核心就包含了对各种云平台的支持,通过定制不同的应用(场景)模式以及对应的驱动就可以轻松支持云平台的部署开发,你可以实现在本地开发,然后直接无缝部署到云平台,已经支持的包括SAE和BAE3。
功能:
3.2版本在此前的3.1.3版本之上,引入了命名空间,强化了驱动化和行为,增强了模块化的概念和对云平台的支持,并改进了诸多的细节。
主要改进包括:
主要改进包括:
-
模块化架构的全新设计
-
全新命名空间和自动导入机制
-
改进的路由功能
-
主题的动态切换支持
-
更强大的Action参数绑定
-
模型的参数绑定支持
-
改进的域名部署支持
-
全新的应用模式
-
全新重写的工具类(包括图像、验证码和上传等)
-
提供更好的云平台支持
-
修正之前发现的众多BUG
注意:3.2以上版本对PHP的版本要求为PHP5.3+ (不包含PHP5.3dev和PHP6)
TinkPHP3.1.3发布 2013/05/09
更新
该版本针对3.1.2进行了一些改进和完善,主要包括:
改进异常处理,支持致命错误捕获;
针对PDO驱动和Sqlsrv驱动的完善,支持参数绑定;
增加变量安全获取和过滤的快捷方法I;
分组支持部署到完整域名或IP;
A和D方法支持跨分组调用;
改进模版引擎的定界符对特殊字符的支持;
修正JS代码可能对模版标签的混淆;
模型的where方法支持多次调用;
默认关闭页面压缩输出;
异常日志的纪录;
Action类的assign方法支持连贯操作;
数据库错误信息包含错误代码;
修正上一版本的一些BUG;
TinkPHP3.1.2发布 2012/11/17
独立分组功能
模板继承
模块和操作映射
AJAX增加jsonp格式支持
分组支持单独配置默认模块和操作
核心编译过程的优化
SAE引擎升级
改进的分页类
修正查询语言的一处安全隐患
ThinkPHP 3.1发布 2012/09/03
[更新]
更加安全的防护和过滤体系
MVC多层支持
Action参数绑定支持
模型命名范围支持
查询条件和SQL预处理功能
动态设置自动验证和自动完成支持
更加灵活强大的缓存管理方法
日志记录简化、增加IP支持
致命错误的捕获机制完善
页面Trace机制改进和分类显示支持
超过128项更新
ThinkPHP 3.0.1 开发版
2012-04-05
[更新]
Action参数绑定支持
模型类命名范围支持
全局系统变量安全过滤支持
增加IS_GET IS_POST IS_PUT 等请求类型常量
日志记录改进 优化日志大小 增加IP记录
U函数对子域名部署的增强和优化
模型类增加filter连贯操作方法 用于对数据的安全过滤
模型类的data方法支持获取当前数据对象
Action类增加_param方法支持 可以自动根据当前提交类型 获取参数
Action类的_get _post方法支持多函数过滤
改进ajaxReturn方法
改进success和error方法
增加自动验证的规则
分组模式下模型分组可以自动加载
模型类增加close方法 驱动类支持多数据库连接关闭
模型类增加表单提交字段合法性检测 配置insert_fields 和 update_fields
模型强制进行数据字段类型验证
增加DB_SLAVE_NO配置参数 用于指定读服务器的序号
优化模型的create方法的数据对象生成
自动验证的function和callback规则支持多字段
[3.0版本]2012-3-23
[修正]
修正视图模型扩展的checkOrder方法
修正U方法对默认分组的完善
修正Redis缓存类
修正sqlsrv驱动
修正模式扩展中的Model类
修正模型的where方法传人空参数的时候导致delete方法删除全部数据的问题
修正路由定义的大写被强制转换为小写的错误
修正静态缓存读取行为扩展
修正Pgsql驱动
修正S方法的缓存有效期
修正Mongo驱动类
[删除]
取消path_info标签扩展位置
取消TAG_NESTED_LEVEL配置参数,该参数已经无效
取消CheckTemplate行为扩展 并入核心App类的init方法
[增加]
App类增加action_name 行为标签位置 用于改变操作方法名
增加引擎扩展 SAE纳入第一个引擎扩展
增加ENGINE_PATH常量定义 用于引擎扩展使用
增加PATH_INFO的兼容判断功能
增加URL_PATHINFO_FETCH配置参数
增加FireShowPageTrace行为扩展 能将Trace信息输出到火狐的firebug
增加Wincache缓存扩展驱动
[完善]
SAE引擎代码优化
优化ThinkPHP入口文件
改进模块名的安全检测 取消异常抛出改成引导到空模块环节
改进Widget类的template属性处理,不区分大小写 方便定义
模型的field方法支持 field(true) 用法 表示获取数据表的全部字段 (而不是*)
改进对mysql驱动的关键字处理方法parseKey
改进MongoDb驱动对读写分离的支持
改进模板引擎的标签别名解析 别名可以无需要定义解析方法
改进Db和sqlite缓存驱动类对有效期参数的判断
规则路由定义支持完整匹配
改进模板检测的自定义模板目录支持
[调整]
系统调试模式配置文件关闭模板缓存
模板字符串替换定义TMPL_PARSE_STRING区分大小写
配置参数只支持一级不区分大小写 二级以下配置参数区分大小写调用
行为日志记录类型改为Log::INFO 类型,方便通过配置文件 单独关闭相关行为日志显示和记录
checkLang行为扩展调整语言包命名规范调整 项目公共语言包 common.php 分组语言包 分组名.php 模块语言包 分组名_模块名.php 或者 模块名.php
[2.1版本]2011-4-30
这次的重点更新是在核心应用上的改造和效率方面的提升,主要体现在:
URL路由灵活模式,支持常规路由定义,正则路由匹配
对比2.0版本,新的路由模式更体贴和应用更方便,同时在执行效率上也得到了更简洁而有效的处理。最重要的是定义路由将更简单和直接,并且可选择使用独立文件定义或是直接配置定义。
2.1版本对分组模式完善了细节流程上的解析机制,增加了实用的常量定义和模板替换,同时添加了对二级域名的友好支持,对项目部署提供了更多方便
允许项目指定编译缓存文件定义
系统函数库functions列入核心编译文件,不再默认绑定到核心编译
以上两项更新虽微,但实际上意义非凡,对于多项目多应用同时部署架构时会起到非常重要的作用,核心的自由度更宽更广了。
改进tag函数,插件机制可以直接定义要执行的行为
项目初始化提供新的可自定义的部署模式
允许自定义项目首次运行时的访问处理方式,系统由原来的简单成功提示,改为探针模式友好提示,对于使用ThinkPHP部署的项目,在初始运行时将方便地提供服务器相关信息,对是否支持ThinkPHP运行环境进行探测并报告和提出建议。
提供AMF模式支持
提供PhpRPC模式(感谢vanvvdot提供扩展)
lite模式增强,支持使用内置模板引擎
数据插入时允许进行更新操作
提供了更简洁的连贯操作方式的数据库切换
新增模板常量、变量定义等实用标签
其它一些应用细节处理可对比svn更新记录
Images图像类恢复图片水印支持
Model类恢复批量插入数据的addAll方法
优化项目核心运行进程细节,去掉不常用功能。
优化系统进程统计处理,提供G函数可进行记录和统计。
完善了多语言在各服务器环境下的兼容性统一
完善了RelationModel方法兼容问题
完善了序列化字段处理
完善了数据编辑的时候唯一检测的验证
增加是否记录异常信息日志开关 LOG_EXCEPTION_RECORD
去除了原svn上的二级域名支持
去除了原svn上的前后置判断处理
去除了个别不通用功能和配置
去除了URL重定向处理,减少HTTP请求的同时,也避免了因此带来的一些错误。
对于以上已去除的功能开关不再生效
[1.0.4 版本] 2008-5-16
修正关联写入和数据字段过滤的冲突
修正哈希子目录缓存方式
模块配置文件命名改为:模块名+_config.php
修正Compare标签
修正CX标签库的判断标签
修正模板引擎的IF标签的条件BUG
修改多数据库连接和切换机制,取消addConnect方法的eqType参数,避免了因来回切换的时候的错误
修正Db缓存和Sqlite缓存的数据过期判断
增加项目配置检测,如果项目配置文件发生修改,则重新生成编译项目缓存。
增加跳转页面模板和404模板配置配置方式和Action类的display方法templateFile参数一致,默认配置: 'ACTION_JUMP_TMPL'=> 'Public:success', 'ACTION_404_TMPL'=> 'Public:404'
Action类增加404操作方法页面跳转操作和404操作支持模板文件配置
修正html标签库的link和import标签
增加数据查询的IS NULL 和 IS NOT NULL支持
修正连贯操作的一些警告错误
完善join分析 支持left right等方式
修正模板引擎在开启短标签的情况下无法正常输出xml标识的问题
修正ORG.Date.Date类的maxDayOfMonth方法
完善多数据库连接的切换
修改命令行自动创建工具build
修正连贯操作的field方法的判断错误
修正Db类的一处where条件判断的小问题
rand_string加上中文随机字符串生成
修正兼容方法json_encode对布尔值的判断
修正ArrayList类的addall方法
修正max min avg sum等查询方法返回浮点型数据错误的问题
修正数组方式查询的自己使用Like问题
iterate标签增加mod属性,用于计算循环变量的取模替换原来的odd属性
增加Input类,用于输入数据管理
删除已经废弃的目录检查插件
优化模板引擎解析,避免多次实例化模板解析类并简化模板解析类的写法,去掉架构方法定义
修改mobile验证的正则
增加了分页类关于负数的判断
部分CX标签的属性可以支持特殊模板变量
F方法生成的文件会自动加上THINK_PATH判断,避免直接执行
取消了当指定模块和操作不存在的时候执行默认模块和默认操作,由用户自己定义空模块和空操作来处理。
增加了连贯操作的data方法,用于指定要操作的数据
去掉了已经废弃的三个配置参数:DB_CACHE_ON DB_CACHE_TIME DB_CACHE_MAX
增加表单提交的MAGIC_QUOTES_GPC判断
model类的query和execute方法支持使用__TABLE__字符串系统会自动替换成当前模型对应的表名
调整了空操作和直接判断模板文件的顺序空操作优先执行
项目编译缓存文件也加上是否去掉注释的开关
[1.0.3 版本] 2008-3-16
增加空模块支持 如果指定的模块不存在会首先定位是否存在Empty模块
增加核心编译文件的去除空白和注释的开关,在入口文件定义 STRIP_RUNTIME_SPACE 常量为false 可以关闭去除空白和注释
Action缓存由原来的userCache成员属性控制改为项目参数 ACTION_CACHE_ON 控制,便于动态控制
增加数据库字段缓存的开关 惯例配置增加DB_FIELDS_CACHE 用以设置数据库字段是否缓存,默认进行缓存
修正xcache和sqlite缓存方式的读写次数记录
使用视图模型的时候,如果主键是id,不需要再定义getPk方法
修正多语言和多模板的cookie问题
入口文件免设置APP_NAME APP_PATH
完善Cookie类
修正模板检查的时候组件化的支持
模型类的查询操作支持连贯方法
去掉了一些废弃的惯例配置参数,包括:DATA_CACHE_ON 和 DATA_CACHE_MAX
惯例配置增加了DATA_CACHE_SUBDIR参数控制文件缓存方式是否自动使用子目录哈希缓存
在项目根目录不存在的情况下自动创建
完善对跨库查询的支持
目录自动创建支持写入安全文件
[ 1.0.2 ] 2008-2-21
Model类增加toArray方法
修正因Log类的改动导致Trace错误信息无法正常显示的问题
数据查询返回的数据集由ArrayObject对象改成数组
修正Model类的create方法在定义字段映射的下面的bug
修正虚拟模型下面create方法的bug
Model类的facade方法增加数据表字段的检测
优化Image类的showAdvVerify方法
修正标签库的compare标签
Trace配置文件由原来的_trace.php更名为trace.php
项目调试配置文件由原来的_debug.php更名为debug.php
项目配置文件由原来的_config.php更名为config.php
路由定义文件由原来的_routes.php 更名为 routes.php
静态定义文件由原来的_htmls.php 更名为 htmls.php
Model类的create方法无需type参数,自动判断新增和编辑模型数据
增加第一次运行目录自动生成功能(只需要定义入口文件)
默认项目编译缓存目录为Temp目录
[ 1.0.1 ] 2008-2-2
修正Db类在Oracle下面的parseLimit方法判断
优化数据库驱动类的查询结果获取
Model 类增加字段的表达式插入和更新支持
完善了Db类的条件查询字段中带有空格的处理
Model类增加了delConnect方法用于删除动态增加的数据库连接
增强了分布式数据库的支持 可以设置是否需要读写分离
Model类增加智能切换功能 switchConnect方法可以自动识别是否是相同的数据库连接类型
增加了组件模块的URL分割定义配置 COMPONENT_DEPR 包括对操作链的设置采用相同的参数定义
修正Model类的count等统计方法会自动缓存的问题 DB类默认关闭查询缓存
修正RBAC组件的权限判断
修正组件模块方式下面的模板文件../Public的替换
修正PDO类在某些数据库下面的getAll方法的BUG
增加核心缓存文件的开关功能 在入口文件里面设置 CACHE_RUNTIME 为 false
修正了使用组件模块的时候模板文件中__URL__的解析问题
修正模板和语言的切换cookie
Model类增加addConnect和switchConnect方法 用于支持多数据库的连接
修正了语言包的缓存导致切换语言无效的问题
Db类增加多数据库连接的内置支持
修正Model类在某些数据库下面where条件表达式不支持where 1 的情况
Db类增加getLastSql方法用于获取最后一次查询的sql语句
完善Log类的操作以及优化错误日志的写入
修正model的数据库连接配置读取
在ajax返回之前保存日志记录
完善compare标签
改进Vendor函数的baseUrl参数定义
改进项目语言包的定义 不同语言分成不同子目录
简化了query方法的数据库缓存
增加clearCache方法,用于清空项目相关缓存目录
增加firebird数据库驱动支持
修正pgsql驱动
修正 app.php 文件的编译缓存路径的问题
增加编译缓存路径的设置 RUNTIME_PATH
[ 1.0.0 ] 2007-12-25
优化了执行效率和内存开销
Import方法增加同名检测和类检测
完善PHP 5.2.0以下版本的支持
去掉了Action类内置的默认操作
改进了MySqli的驱动类库
修正了主键不是自动增长的时候Model的add方法返回错误
修正了mysqli的escape_string方法
修正了PDO的连接params参数问题
修正了Model的findAll的关联查询问题
修正了Model类的getModelName方法问题
修正了RBAC的模块大小写设置
去掉volist resultset标签,均作为iterate标签的别名
增加了项目编译机制和核心类库编译机制
标签库定义增加标签的别名定义
XML模版结束标签增加对空格的支持
增加compare标签和eq neq gt egt lt elt heq 和nheq标签别名
增加了多模版和多语言的开关
RBAC认证增加了操作的认证设置,之前只支持模块的认证设置
-
OneThink
-
ThinkCMF是由第三方团队开发的中文内容管理框架;ThinkCMF是一款基于PHP+MYSQL开发的中文内容管理框架。ThinkCMF提出灵活的应用机制,框架自身提供基础的管理功能,而开发者可以根据自身的需求以应用的形式进行扩展。每个应用都能独立的完成自己的任务,也可通过系统调用其他应用进行协同工作。在这种运行机制下,开发商场应用的用户无需关心开发SNS应用时如何工作的,但他们之间又可通过系统本身进行协调,大大的降低了开发成本和沟通成本。普通的CMS(内容管理系统)一般不能完成所有的需求,而因为CMS在ThinkCMF内部只是已一个应用的形式存在,所以使用ThinkCMF你可以用CMS来管理你的内容,用电影网站系统来管理视频,用电商系统来管理电商网站。这些程序不会影响,你可以模块化的增加或减少应用。[8]
1简介
ThinkPHP是一个免费开源的,快速、简单的面向对象的轻量级PHP开发框架,引入了全新的CBD(核心+行为+驱动)架构模式,同时支持SAE、REST和Mongo
2入门基础
2.1基础概念
2.2获取ThinkPHP
2.3关于版本
2.4环境要求
2.5许可协议
3架构设计
3.1系统特性
3.2目录结构
3.3MVC分层
3.4执行流程
3.5命名规范
3.6入口文件
3.7项目编译
3.8URL访问
3.9控制器
3.10模型
3.11数据库抽象层
3.12视图
3.13模板引擎
3.14函数库
3.15类库
3.16扩展
4构建应用
4.1开发流程
4.2入口文件
4.3自动生成
4.4项目配置
4.5业务逻辑
4.6模板定义
4.7运行应用
5开发指南
5.1配置
5.2控制器
5.3模型
5.4视图
5.5错误和日志
5.6调试
5.7缓存
5.8安全
5.9部署
5.10杂项
6扩展指南
6.1类库扩展
6.2应用扩展
6.3控制器扩展
6.4模型扩展
6.5驱动扩展
6.6Widget扩展
6.7行为扩展
6.8标签库扩展
6.9模板引擎扩展
6.10模式扩展
7模板指南
7.1变量输出
7.2使用函数
7.3系统变量
7.4快捷输出
7.5默认值输出
7.6包含文件
7.7导入文件
7.8Volist标签
7.9Foreach标签
7.10Switch标签
7.11比较标签
7.12Range标签
7.13Present标签
7.14Empty标签
7.15Defined标签
7.16IF标签
7.17标签嵌套
7.18使用PHP代码
7.19原样输出
7.20模板注释
7.21引入标签库
7.22修改定界符
8附录
8.1常量参考
8.2配置参考
8.3函数参考
8.4类库参考
8.5关于升级
8.6代码重构
8.7开源应用
8.8典型案例
8.9大事记
8.10鸣谢