谁能解释一下这两个坦克世界插件站的作用和用法,据说能改善游戏性能

10134人阅读
1&&研究背景
许多PHP程序员经历了各种开发环境之后肯定有自己的一套框架选择池不同的网站和应用需要不同的框架但是此论文的论述不在这里讨论只对和的一些配置语法和一些特性区别给予论述使读者对这两个框架有更好的了解
2&&使用框架
开发者可能出于不同的考虑而使用开发,不过首当其冲的原因是为了加速开发过程。相似工程之间的代码重用能够节省开发者大量的时间和精力。开发框架内置了预建的模块,免去了冗长又令人厌烦的编程工作。这样开发者就能够把时间活在开发实际程序上,而不是每一次都要为每一个项目重建基础模块。
稳定性是开发者使用框架的另一个重要原因。尽管简单是最大的资本,也是许多人喜爱这个的原因,它也是的”,尤其是那些初学者而言,是如此的简单以至于他们会完全没有意识地写出低质量的代码。这样的程序可能在大多数时间内仍正常工作,但你可能已在代码中留下了巨大的安全漏洞,使其易受攻击。要时刻牢记是一门很宽松的语言十分重要,因此确保不在代码中遗留任何安全漏洞是重中之重即使程序看起来工作正常。
最后一点,开发框架是可扩展的,并且有许多框架可供选择。你也可以创造你自己的,不过许多开发者决定从那些流行的知名的开发框架中做选择,因为它们往往有着庞大的支持团队,以及相关的论坛社区方便你与其他使用同一个框架的开发者相互交流。注意,你应当事先检验你的项目是否需要使用框架,这里提供一份简单的列表以供参考:使用框架能否节省你(和其他任何会使用它的人)的时间和精力?是否能够让程序得到更好的表现?能否提高稳定性?如果你对上面任何一个问题的回答是肯定的,那么使用开发框架对于这个项目就可能是正确的选择。&
1.3&&开发环境
实验环境:Windows&7&Professional&+&Apache&2.0&+&Mysql&5.0&+PHP&5.4
文件目录根目录
TPCI下包括和两个文件夹分别作实验台的根目录和实验台根目录
ThinkPHP版本&
CodeIgniter&版本
使用编辑器&
ThinkPHP&和CodeIgniter&
2.1.1&&ThinkPHP&介绍
ThinkPHP可以支持服务器环境,正式版需要以上版本支持,支持、、以及等多种数据库,框架本身没有什么特别模块要求,具体的应用系统运行环境要求视开发所涉及的模块。
使用,你可以更方便和快捷的开发和部署应用,当然不仅仅是企业级应用,任何应用开发都可以从的简单、兼容和快速的特性中受益。简洁、快速和实用是发展秉承的宗旨,为此会不断吸收和融入更好的技术以保证其新鲜和活力,提供应用开发的最佳实践。  作为一个整体开发解决方案,能够解决应用开发中的大多数需要,因为其自身包含了底层架构、兼容处理、库、数据库访问层、、缓存机制、机制、角色认证、表单处理等常用的组件,并且对于跨版本、跨平台和跨数据库移植都比较方便。并且每个组件都是精心设计和完善的,应用开发过程仅仅需要关注您的业务逻辑。  遵循&发布,意味着用户可以免费使用,甚至允许把用户的应用采用商业发布.[1]
2.1.2&&ThinkPHP&的分层架构
ThinkPHP的分层架构采用模式:
表现层:包含模板、用户界面、、等通过的支持,可以使用标签定义简化表现层的定义工作。
业务层:包含业务接口层、、实体层、Action作为业务接口层,提供系统各种业务操作的入口。因此,不提倡在控制器类中写过多的业务逻辑代码,虽然说很难严格控制。具体的业务逻辑应该封装到()类中实现,如果觉得过于复杂,还可以把子业务在类中包装后统一调用。业务处理过程一般会构造出对象(如对象),对业务实体对象的存取通过数据访问层完成。数据访问层把实体对象和数据库数据之间建立关系,并且封装了通用的数据操作。
数据层:目前支持的数据库有、、、、,最新版本已经提供的支持,数据库的选用和业务逻辑没有关系。&[1]
2.1.3&&ThinkPHP&的MVC模式
():模型的定义由类来完成。类位于项目目录下面的目录。
():应用控制器(核心控制器)和控制器都承担了控制器的角色,区别在于控制器完成业务过程,而应用控制器(类)负责调度控制。控制器位于项目目录下面的目录。  
():模板的实现是和框架无关的,做到了分离,可以独立预览和制作。模板目录位于项目目录下面的目录。&独创的核心编译和项目编译机制&.[1]
2.1.4&&ThinkPHP&独创的核心编译和项目编译机制
是一个使用了技术的编译型,支持两种类型的模板标签,使用了和缓存技术,而且支持自定义标签库。其特点包括:
  支持标签库和普通标签的混合定义;
  编译一次,下次直接运行而无需重新编译;
  模板文件更新后,自动更新模板缓存;
  自动加载当前操作的模板缓存文件,无需指定模板文件名称;
  支持转换和更换;
6)模板输出前缀支持,避免变量名称冲突;  
7)模板常量替换,无需设置模板变量;  
8)支持变量组合调节器和格式化功能;  
9)支持替换其它模板引擎使用;  
10)支持获取模板页面内容[1]
2.1.5&&ThinkPHP&特性
内置模板引擎,支持标签库
富模型支持
1)聚合模型:
聚合模型是一种虚拟模型,用于把数据表的字段抽象化,更加容易理解和操作。
我们可以把数据表中的某些属性进行,这样就把枯燥的数据表字段赋予更好的可读性。
静态模型可以让模型的数据静态化,而不需要频繁和数据库打交道,可以用于不经常不变的数据表。而且在层上面模拟实现了数据库的视图功能,这是独创的一项技术,使得多表的关联查询具有更高的效率和可操作性,而无需定义复杂的关联关系,让关联关系更加浅显易懂。
有些时候,数据表的数据一旦添加后就不再容易变化,我们更希望把这样的模型数据化,而不需要再次访问数据库。支持静态模型的概念,一旦把模型设置为静态,那么会在第一次初始化的时候获取数据表的全部数据,并生成缓存,以后不会再连接数据库。而只需要直接访问模型的数据即可。
3)视图模型
ThinkPHP在模型里面模拟实现了数据库的视图模型,该功能可以用于多表查询。  要定义视图对象,需要设置为,然后设置属性即可。
CURD和操作高度自动化支持
ThinkPHP提供了灵活和方便的数据操作方法,不仅实现了对数据库操作的四大基本操作():创建、读取、更新和删除的实现,还内置了很多实用的数据操作方法,提供了模式的最佳体验。
丰富的查询语言支持
ThinkPHP大多数情况使用的都是对象查询,因为充分利用了查询语言,了解查询条件的定义对使用对象查询非常有帮助,对于复杂的查询,或者从安全方面考虑,可以使用对象或者索引数组来传递查询条件。
自动创建目录结构
ThinkPHP具有项目目录自动创建功能,你只需要定义好项目的入口文件,第一次执行入口文件的时候,系统会自动创建项目的相关目录结构,如果是环境下面需要给项目入口文件里面指定的路径设置可写权限。
ThinkPHP的模型支持主从式数据库的连接,配置为可以采用分布式数据库支持。
多数据库连接和切换支持
如果需要在特殊的时候连接多个数据库,那么可以尝试使用的多数据库连接特性:包括相同类型的数据库和不同类型的数据库。(注意:所谓的相同类型数据库的定义是指和项目配置文件或者模型的数据库连接的数据库类型相同。)
ActiveRecords模式和丰富的特性
ThinkPHP实现了模式的模型,采用了非标准的模型:表到类,记录(集)映射到对象,字段属性映射到对象的虚拟属性。最大的特点就是使用方便,从而达到的目的。
灵活简单的项目配置
ThinkPHP提供了灵活的配置功能,采用最有效率的返回方式定义,支持惯例配置、项目配置、调试配置和模块配置,并且会自动生成配置缓存文件,无需重复解析的开销。对于有些简单的应用,你无需配置任何配置文件,而对于复杂的要求,你还可以增加模块配置文件,另外的动态配置使得你在开发过程中可以灵活的调整配置参数。
ThinkPHP在项目配置上面创造了自己独有的分层配置模式,其配置层次体现在:惯例配置项目配置模块配置操作(动态)配置,优先顺序从右到左(在没有生效的前提下)。
模型自动验证和处理
系统内置了的自动验证功能,而大多数情况下面,数据对象是由提交的数据创建。需要使用系统的自动验证功能,只需要在类里面定义属性,是由多个验证因子组成的数组,支持的验证因子格式:验证字段,验证规则,错误提示,验证条件,附加规则,验证时间。
生成和多元化缓存机制
ThinkPHP内置了静态的功能,并且支持静态缓存的规则定义。要使用静态缓存功能,需要开启参数,并且在项目配置目录下面增加静态缓存规则文件。  
丰富的数据库及支持
易扩展的系统库
系统基类库
ThinkPHP框架通过基类库的概念把所有系统类库都集成在一起,包括的核心类库。
目前的基类库分成核心类库、扩展类库,在这主要介绍的是核心基类库,核心基类库的作用是完成框架的通用性开发而必须的基础类和常用工具类等,包含有:
  核心类库包
  数据库类库包
  系统工具类库包
  内置模板引擎类库包
  异常处理类库包函数库
  内置了一个系统公共函数库,提供了一些系统需要的函数,系统函数库位于的目录下面,名称为。
每个项目可以定义自己的函数库,位于项目的目录下面的文件。  
如果项目在目录下面有定义自己的文件,框架会在初始化的时候自动导入,而无需自己导入。
  匹配导入
  方法是内建的类库和文件导入方法,提供了方便和灵活的类似于命名空间的文件导入机制。
  自动编码转换
  的文件全部采用编码格式,的支持和自动输出编码转换的功能让页面表现更加灵活。您可以配置输出的页面编码格式,如等(默认采用输出)。系统根据配置文件中设置的编码格式自动对页面进行编码转换,支持和两种方式,为了提高效率,如果系统的模板编码设置和输出编码设置项相同,则不会进行编码转换。可以设置模板编码、输出编码和数据库编码,并自动完成转换工作,让你的应用不再受编码的苦恼。  
组件和插件支持
基于角色的权限控制体系  
企业级的应用是离不开安全保护的,以基于的作为参考原型,并做了简化,以适合目前的结构,提供了一个多层的、可定制的安全体系来为应用开发提供安全控制。安全体系中主要有:&安全拦截器、认证管理器、决策访问管理器&、运行身份管理器。[2]
2.2&CodeIgniter
2.2.1&&CodeIgniter&介绍
CodeIgniter&是一套给&网站开发者使用的应用程序开发和工具包。它提供一套丰富的标准库以及简单的接口和,其目的是使开发人员更快速地进行项目开发。使用&可以减少代码的编写量,并将你的精力投入到项目的创造性开发上。
CodeIgniter是由公司的开发的。其核心框架是为这个程序特别编写的,而其他很多类库、辅助函数和子系统则来自于和编写的内容管理系统。来自的启发我们创造了一个框架,并且将框架的概念引入到网络社区的一般意识中。[2]
2.2.2&&CodeIgniter&技术和架构
CodeIgniter&的目标是在最小化,最轻量级的开发包中得到最大的执行效率、功能和灵活性。  
为了达到这个目标,我们在开发过程的每一步都致力于基准测试、重构和简化工作,拒绝加入任何对实现目标没有帮助的东西。
从技术和架构角度看,按照下列目标创建:
动态实例化。在&中,组件的导入和函数的执行只有在被要求的时候才执行,而不是在全局范围。除了最小的核心资源外,不假设系统需要任何资源,因此缺省的系统非常轻量级。被&请求所触发的事件,以及你设计的和视图将决定它们什么时候被引用。
。耦合是指一个系统的组件之间的相关程度。越少的组件相互依赖那么这个系统的重用性和灵活性就越好。我们的目标是一个非常松耦合的系统。
组件专一性。专一是指组件有一个非常小的专注目标。在&里,为了达到最大的用途,每个类和它的功能都是高度自治的。&是一个动态实例化,高度组件专一性的松耦合系统。它在小巧的基础上力求做到简单、灵活和高性能。&
2.2.3&CodeIgniter&设计和目录
CodeIgniter&是基于模型视图这一设计模式的。是一种将应用程序的逻辑层和表现层进行分离的方法。在实践中,由于表现层从&脚本中分离了出来,所以它允许你的网页中只包含很少的脚本。[3]
 模型&代表你的数据结构。通常来说,你的模型类将包含取出、插入、更新你的数据库资料这些功能。
&视图&是展示给用户的信息。一个视图通常是一个网页,但是在&中,一个视图也可以是一个页面片段,如页头、。它还可以是一个&页面,或任何其它类型的页面。&
控制器&是模型、视图以及其他任何处理&请求所必须的资源之间的中介,并生成网页。&在&使用上非常宽松,因此模型不是必需的。如果你不需要使用这种分离方式,或是发觉维护模型比你想象中的复杂很多,你可以不用理会它们而创建自己的应用程序,并最少化使用控制器和视图。也可以和你现有的脚本合并使用,或者允许自行开发此系统的核心库,其目的是,使你可以以最适合你的方式工作。&[2]
2.2.3&&CodeIgniter&特性
开发框架优秀与否与它有多少特性没有太大的关系。你从特性中不能推断出用户的体验、不能体验到框架设计是不是直截了当,是不是智能。特性也不能告诉你框架代码的质量如何、性能如何、细节处理的如何、安全性如何。判断一个框架的唯一办法是在使用中了解它。安装很简单,所以,请你使用它。的主要特性如下:
  基于&体系
  超轻量级
  对数种数据库平台的全特性支持的数据库类
  安全性与&过滤
  邮件发送类,支持附件,或文本邮件,多协议和&及更多。  
*&图像处理类库剪裁,缩放,旋转等。支持&,和&
  文件上传类
  本地化
  全页面缓存
  应用程序评测
  日历类
  编码类
  搜索引擎友好的&
  灵活的&
  支持钩子和类扩展
  大量的辅助函数&[3]
ThinkPHP&和&CodeIgniter在应用中比较
3.1&&配置ThinkPHP
在使用ThinkPHP之前,要先配置,我用的是。的框架包只有一个名为的的文件夹,将他拷到网站目录下后要建立一个的入口文件。的入口文件和的入口文件有很大区别最明显的一点就不用再写方法是自动进行的
在拷贝的时候就发现一直在做一个轻量级开发框架而框架包比还要小说明比还要轻巧在后面的叙述中会有详细解释
下面写的入口文件一个的入口文件包括了几项载入框架入口文件
(1)&定义框架路径
(2)&定义项目名称
(3)&定义项目路径
(4)&定义定义调试模式
(5)&定义显示页面轨迹
(6)&加载入口文件此步为必须以上为可选
如果不定义项目路径就会自动在的当前框架目录下生成四个文件夹它们是&他们基本都是空文件夹用来存放相应的文件信息
表目录结构
项目公共文件目录,一般放置项目的公共函数
项目配置目录,项目所有的配置文件都放在这里
项目语言包目录(可选&如果不需要多语言支持&可删除)
项目类库目录,通常包括和子目录
项目模板目录,支持模板主题
项目运行时目录,包括(模板缓存)、(数据缓存)、(数据目录)和(日志文件)子目录,如果存在分组的话,则首先是分组目录。
图项目目录机构
通过图片可以看到如果不定义项目路径文件夹和框架的文件夹在同一级目录下所以显得杂乱一般的我们都定义一个项目路径而项目路径就是以项目名为文件夹与框架同一级修改后的项目目录结构如下图
图项目目录机构
其中文件夹包含了四个文件夹下面是入口文件的内容
define(&THINK_PATH&,&./ThinkPHP/&);
define(&APP_NAME&,&TP&);
define(&APP_DEBUG&,true);
//&开启调试模式
define(&SHOW_PAGE_TRACE&,true);
define(&APP_PATH&,&TP/&);//定义项目路径
require&THINK_PATH.'ThinkPHP.php';
之后再浏览器中输入的路径&显示如下说明配置成功
图项目测试主页
ThinkPHP&没有提供入口文件所以如果不配置是无法直接打开的而把框架拷贝过来后入口文件是已经配置好的
3.2&配置CodeIgniter
在使用之前也要配置我用的是的框架包包括和&两个文件夹和一个共里面是用户需要操作的里是系统核心是入口文件
图项目目录
拷贝过来之后就可以直接运行在浏览器中输入相应路径会出现如下图
图项目初始化主页
由于入口文件已经给出所以下面对入口文件进行解析
CodeIgniter的入口文件内容比多很多下面我们进行一一解析
define('ENVIRONMENT',&'development')
定义环境类型此处有三项可以选择分别是开发实验和产品网站建设初期用这也是的默认选择
下面针对定义的进行判断错误信息报告这里对网站安全可以提供保障如果是环境将提示所有警告错误信息如果是则提示系统相应的的设置的警告错误信息如果是环境将屏蔽所有警告
if&(defined('ENVIRONMENT'))
switch&(ENVIRONMENT)
case&'development':
error_reporting(E_ALL);
case&'testing':
case&'production':
error_reporting(0);
exit('The&application&environment&is&not&set&correctly.');
之后便是指定和对应的就是框架中的文件夹对应的就是框架中的文件夹由于安全问题或者为了开发便捷可能会有改动所以在这里可以定义我们为了说明简单使用系统默认
$system_path&=&'system';
$application_folder&=&'application';
下面就是针对配置文件进行设置
如果配置文件加载了则改变目录到&所在的目录如果文件夹的目录不存在将在目录后加再不成则提示系统目录错误
if&(defined('STDIN'))
chdir(dirname(__FILE__));
if&(realpath($system_path)&!==&FALSE)
$system_path&=&realpath($system_path).'/';
//&ensure&there's&a&trailing&slash
$system_path&=&rtrim($system_path,&'/').'/';
//&Is&the&system&path&correct?
if&(&!&is_dir($system_path))
exit(&Your&system&folder&path&does&not&appear&to&be&set&correctly.&Please&open&the&following&file&and&correct&this:&&.pathinfo(__FILE__,&PATHINFO_BASENAME));
之后对系统变量进行定义包括文件名文件扩展名系统路径等基础变量
define('SELF',&pathinfo(__FILE__,&PATHINFO_BASENAME));
define('EXT',&'.php');
define('BASEPATH',&str_replace(&\\&,&&/&,&$system_path));
define('FCPATH',&str_replace(SELF,&'',&__FILE__));
define('SYSDIR',&trim(strrchr(trim(BASEPATH,&'/'),&'/'),&'/'));
对项目文件夹进行定义在里项目文件夹就是项目名而在里项目文件夹就是文件夹
if&(is_dir($application_folder))
define('APPPATH',&$application_folder.'/');
if&(&!&is_dir(BASEPATH.$application_folder.'/'))
exit(&Your&application&folder&path&does&not&appear&to&be&set&correctly.&Please&open&the&following&file&and&correct&this:&&.SELF);
define('APPPATH',&BASEPATH.$application_folder.'/');
在所有定义完之后和一样进行载入启动项目核心文件
require_once&BASEPATH.'core/CodeIgniter.php';
这样在浏览器输入相应地址后就会出现前面提到的那个网页
3.3&Hello&World
作为程序员每接触一个新的语言或者框架都有一个习惯就是输出一个我也是这样的下面就两个框架输出对和做对比
3.3.1&ThinkPHP&输出
ThinkPHP&在入口文件建好后就会自动的有显示通过常规思维就可以知道修改那几个字就可以出现那在哪修改呢的模式非常强大和对应的文件夹在对应的文件夹在而对应的文件夹在由于是编译型框架模板引擎的使用十分强大的模板文件的扩展名为无法使用原生只能按照的模板引擎的标签规则进行操作但是我们可以看到现在文件夹里是空的那是怎么显示的文字呢这就要看的
在文件夹里有一个名为&的文件里面就一个相应的输出如下图
有上图可以看出几点
所有自定义类都是继承类拥有的所有方法
ThinkPHP的控制器采用面向对象的方法
Index&是默认方法并且第一个字母不用大写而文件名第一个字母和的第一字母要大些并且名字和名相同
在编译过程中会执行方法方法里的输出会直接输出在浏览器里
我们将文件进行修改后输出
(由于本文只对和的一些性质对比对语法不做过多解释函数的用法就是发送头以后不再对语法进行解释
class&IndexAction&extends&Action&{
&&&&public&function&index(){
echo&&Hello&World&;
输入相应地址后出现期待结果如下图
虽然出现了想要的结果但是的设计理念里在里输出内容是不可取的不符合的形式在为了和比较我们在这里载入相对应的也就是模板在里加入
& $this-&display();
Index为模板文件名不写扩展名相当于和进行连接组合最后通过将模板显示再运行之后出现报错如下图
图的错误提示
通过提示可以看出的一些特性错误提示页面很友好并把错误出现位置错误解释和文件轨迹全部显示出来用来用户参考这是在调试过程中在产品中这个页面会被错误页面取代
通过错误信息可以看出的模板文件放在里并且以控制器名字命名文件夹文件夹内再以方法名命名类这是默认的方式当然也可以通过给定变量来改变这一方式这里先用默认方法
我们按照提示建立文件及时是空文件刷新页面后显示正常说明的模板找到后可以执行编译通过报错信息我们还可以简单了解到的编译过程
当然由于本次操作并没有进行数据库操作但是也是完成了的一次页面实例化开启缓存机制后编译后的文件会在目录下的中存在编译后的文件是以加密后的名字命名里面使用原生的语法提高访问效率但是每次改动后最好都要删除文件夹下的内容防止缓存延误修改的内容
ThinkPHP是怎样通过模板输出控制器中的变量的呢
在的控制器里编辑
class&IndexAction&extends&Action&{
&&&&public&function&index(){
$data=&Hello&World&;
$this-&assign('hello',$data);
$this-&display();
这样将控制器和模板联系起来此句的意思就是将控制器中的变量赋值给模板中的变量我们在模板文件里书写如下语句
这样遍通过模板显示了变量的内容通过编译后的文件可以看到
&?php&if&(!defined('THINK_PATH'))&exit();&echo&($hello);&?&
输出了变量内容
3.3.2&CodeIgniter&输出
CodeIgniter的输出显然比的输出方式正规一些在官方的默认中控制器在中为文件夹文件夹中有一个名为的文件在项目配置文件中里可以配置默认的控制器方法框架包中默认的是方法我们可以修为对应的是方法所以你可以用三种方法访问
图主页形式
图主页形式
图主页形式
路径的形式和类似是入口文件以后的所有操作都是在之后完成的但是可以对服务器进行操作使其将隐藏在网站根目录下建立文件由于是在下诞生的文件的形式是下的隐藏文件以开头没有扩展名在这个文件里用文本编辑器打开输入如下内容后即可要求服务器打开&模块
&IfModule&mod_rewrite.c&
RewriteEngine&on
RewriteCond&%{REQUEST_FILENAME}&!-d
RewriteCond&%{REQUEST_FILENAME}&!-f
RewriteRule&^(.*)$&index.php/$1&[QSA,PT,L]
&/IfModule&
在框架里文件夹下的文件夹下包含了项目的配置文件其中有的配置文件里面有两个项目一个就是主页的设置默认为我们在以后的使用中将其改为还有一个是错误页面的自定义我们默认为空
$route['default_controller']&=&&index&;
$route['404_override']&=&'';
按照使用习惯我们把默认路由改为也就是
同时在文件夹下建立的视图文件这一点和有很大不同这和不是编译型框架有很大关系的框架视图里可以随时使用原生语法当然也是可以的但是的视图模板里要用到提供的大量标签比如之类的而里则使用原生的语法即可比如和&是同等的
建立视图后通过浏览器并不能直接浏览因为也符合规范需要在里建立的控制器在默认的控制器里我们已经可以看到默认类之前给出一句话
if&(&!&defined('BASEPATH'))&exit('No&direct&script&access&allowed');
这是为了防止跨网站攻击用的而在里是没有的还是因为是编译型框架在编译过程中已经为每个网页里添加了一句放跨站攻击的语句这句话可以再项目目录下的文件夹下的文件夹下的任意一缓存编译后的文件里找到这样一句话
if&(!defined('THINK_PATH'))&exit();
这也是放跨站攻击会在项目里定义如果没定义说明非本网站请求给予拒绝
说到放跨站攻击机制在每个目录下都建立一个的文件如果有非正常请求会在浏览器端显示内容
与类似在的控制器里编辑类
class&Index&extends&CI_Controller&{
public&function&__construct()
parent::__construct();
public&function&index()
echo&&Hello&World&;
$this-&load-&view('index');
在自定义类继承的类之后还要对父类进行构造否则无法加载的函数库修改后输入相应地址我们发现由于我们新建立的视图文件是空的但符合了规则浏览器中输出了这也说明了在里仍然可以向浏览器输出数据这和是类似的但是的控制器和视图的数据传送和有些不同
在里我们要先把数据复制到数组里之后将数组导入到视图但是视图中并不存在变量而存在变量里键名为变量名的变量所以我们将复制给之后将导入到视图
public&function&index()
$data[&hello&]=&Hello&World&;
$this-&load-&view('index',$data);
同时在新建立的中编辑简单的一句话来打印变量
&?=$hello?&
这样我们刷新页面发现被打印了出来
在这个方面和倒是有类似的地方区别并不是太大
3.4&$_POST&和&$_GET方法
在表单应用中可以利用它自有的函数库建立表单在本论文中不讨论我将在和两个项目视图中建立两个相同的表单并提交到输出观察结果从而讨论区别
在类中加入方法
class&IndexAction&extends&Action&{
&&&&public&function&index(){
$this-&display();
public&function&test(){
dump($_POST);
在方法里接收变量打印出数组这里用了的一个函数与类似
下面是而对应的的表单代码
&form&action=&__APP__/Index/test&&method=&post&&&
&input&type=&text&&name=&name&&/&
&input&type=&submit&&value=&TP&submit&&/&
__APP__为的项目路径
在对应的的控制器类添加方法
class&Index&extends&CI_Controller&{
public&function&__construct()
parent::__construct();
$this-&load-&helper(&url&);
public&function&index()
$this-&load-&view('index');
public&function&test(){
var_dump($_POST);
为了方便操作在测试中使用了的函数库使其可以使用函数方便在中路径的编辑
下面是的表单代码
&form&action=&&?=base_url();&?&index.php/Index/test&&method=&post&&&
&input&type=&text&&name=&name&&/&
&input&type=&submit&&value=&CI&submit&&/&
方法和表单都设置好后我们开始进行测试
3.4.1&ThinkPHP&的表单
ThinkPHP的表单值得一提的是它为每一个表单都默认加了一个防止表单的重复过多提交但是这个强硬的加入易导致一些问题比如用增加表单时就会因为双引号问题而无法使用唯一一个解决办法就是取消在的配置文件里面设置由于本次试验不涉及内容所以没有取消规则
图测试表单
网页源代码为
&form&action=&/TPCI/TP/index.php/Index/test&&method=&post&&&
&&input&type=&text&&name=&name&&/&&
&input&type=&submit&&value=&TP&submit&&/&
&&input&type=&hidden&&name=&__hash__&&value=&296b375d2dcddb9c3fbb513ac64ea343_a500e3a3d75eb08d2b1cb&&/&&/form&
可以看出已经自动为表单添加了隐藏变量
那么输入并提交后页面显示
array(2)&{
&&[&name&]&=&&string(11)&&Hello&World&
&&[&__hash__&]&=&&string(65)&&296b375d2dcddb9c3fbb513ac64ea343_a500e3a3d75eb08d2b1cb&
已经提交过来并正常显示
将表单的提交形式改为&在控制器中也将改为再进行测试后页面显示
array(3)&{
&&[&name&]&=&&string(11)&&Hello&World&
&&[&__hash__&]&=&&string(65)&&296b375d2dcddb9c3fbb513ac64ea343_a500e3a3d75eb08d2b1cb&
&&[&_URL_&]&=&&array(2)&{
&&&&[0]&=&&string(5)&&Index&
&&&&[1]&=&&string(4)&&test&
除了我们之前说的外有多了一个数组另外在解析上也有其独特之处
ThinkPHP框架基于模块和操作的方式进行访问,由于框架的应用采用单一入口文件来执行,因此网站的所有的模块和操作都通过的参数来访问和执行。这样一来,传统方式的文件入口访问会变成由的参数来统一解析和调度。
ThinkPHP支持四种模式,可以通过设置参数来定义,包括普通模式、、和兼容模式。
一、普通模式:设置为
采用传统的参数模式
二、模式(默认模式):设置为
默认情况使用模式,内置强大的支持,提供灵活和友好支持。模式自动识别模块和操作,例如
在不考虑路由的情况下,第一个参数会被解析成模块名称(如果启用了分组的话,则依次往后递推),第二个参数会被解析成操作,后面的参数是显式传递的,而且必须成对出现,例如:
其中参数之间的分割符号由参数设置,默认为,例如我们设置为的话,就可以使用下面的访问
注意不要使用和符号进行分割,该符号有特殊用途。
略加修改,就可以展示出富有诗意的,呵呵~
如果想要简化的形式可以通过路由功能(后面会有描述)以及空模块和空操作。
在模式下面,会把相关参数转换成变量,以及并入变量,因此不妨碍里面的和变量获取。
三、模式:&设置为
该模式和模式功能一样,除了可以不需要在里面写入口文件,和可以定义文件外。在开启了的模块后,就可以启用模式了,具体参考下面的重写部分。
四、兼容模式:&设置为
兼容模式是普通模式和模式的结合,并且可以让应用在需要的时候直接切换到模式而不需要更改模板和程序,还可以和模式整合。兼容模式可以支持任何的运行环境。
兼容模式的效果是:
并且也可以支持参数分割符号的定义,例如在为的情况下,下面的有效:
其实是利用了参数,用普通模式的实现模拟了的模式。但是兼容模式并不需要自己传变量,而是由系统自动完成部分。正是由于这个特性,兼容模式可以和模式之间直接切换,而不需更改模板文件里面的地址连接。[2]
3.4.2&CodeIgniter的表单
CodeIgniter的表单功能也很强大并且提供了表单验证函数而并没有表单验证的函数但是在的里有对字段的验证放在下一章节讨论下图是的表单
图测试表单
&form&action=&http://127.0.0.1/TPCI/CI/index.php/Index/test&&method=&post&&&
&input&type=&text&&name=&name&&/&
&input&type=&submit&&value=&CI&submit&&/&
可以看到只是函数被替换成地址外其他的并没有什么改动我们提交
页面中只显示了一行并没有其他附加的东西
array(1)&{&[&name&]=&&string(11)&&Hello&World&&}&
接下来我们将改为后结果是一样的
既然和的结果类似我为什么还拿出来比较呢因为还有一点没有测试
我们在浏览器地址栏中输入
会看到浏览器输出
array(2)&{
&&[&name&]&=&&string(10)&&HelloWorld&
&&[&_URL_&]&=&&array(4)&{
&&&&[0]&=&&string(5)&&Index&
&&&&[1]&=&&string(4)&&test&
&&&&[2]&=&&string(4)&&name&
&&&&[3]&=&&string(10)&&HelloWorld&
这是的结果那么输入
浏览器出输出array(0)&{&}&,没有结果
这边是和在地址解析方面的区别
CodeIgniter则在上没有这么多选择只有一个启用查询字符串使用浏览器常规的显示方法即的&URL_MODEL&0.其他的则有&添加任意后缀为了网站安全考虑等小的功能无法和强大的路由相比
但是的控制器里可以添加参数将控制器的方法改为
public&function&test($name){
然后再浏览器中浏览
会发现浏览器打印出通过实验可以知道赋值为中可以吧的一部分转换问方法的参数而则没有这个功能
3.5&Model的使用
ThinkPHP和比较大的一个区别就是的使用对于其相似的类型设置因为只是部分不一样其效果是一样的不在讨论范围下文只对其中区别较大的地方做讨论
3.5.1&ThinkPHP的Model
ThinkPHP模型类一般位于项目的目录下面,当我们创建一个类的时候,其实已经遵循了系统的约定。模型类的命名规则是除去表前缀的数据表名称,采用驼峰法命名,并且首字母大写,然后加上模型类的后缀定义,以为例
模型名(类名)
约定对应数据表(假设数据库的前缀定义)
think_user
UserTypeModel
think_user_type
如果你的规则和上面的系统约定不符合,那么需要设置类的数据表名称属性。
在的模型里面,有两个关于数据表名称的属性定义:
表数据库表明属性定义
不包含表前缀的数据表名称,一般情况下默认和模型名称相同,只有当你的表名和当前的模型类的名称不同的时候才需要定义。
trueTableName
包含前缀的数据表名称,也就是数据库中的实际表名,该名称无需设置,只有当上面的规则都不适用的情况或者特殊情况下才需要设置。
定义模型当前对应的数据库名称,只有当你当前的模型类对应的数据库名称和配置文件不同的时候才需要定义。
ThinkPHP的命名规则十分严格大小写的限制也很严谨如果不遵守默认原则除了要修改一些配置文件外就会出错
在使用的时候有许多方法在中使用方法或者实例化同时还有一个方法方法会自动判断并且会提供一些方法没有的函数供使用同时空的即或者里&可以使用原生语句查询
ThinkPHP里有两个属性十分有意思一个是$_validate属性还有一个是$_auto&属性这两个属性分别对应的是自动验证和自动完成
自动验证中类型检查只是针对数据库级别的验证,所以系统还内置了数据对象的自动验证功能来完成模型的业务规则验证,而大多数情况下面,数据对象是由表单提交的数据创建。需要使用系统的自动验证功能,只需要在类里面定义属性,是由多个验证因子组成的二维数组。
protected&$_validate&=&array(
array('verify','require','验证码必须!默认情况下用正则进行验证
array('name','','帐号名称已经存在!在新增的时候验证字段是否唯一
array('value',array(1,2,3),'值的范围不正确!当值不为空的时候判断是否在一个范围内
array('repassword','password','确认密码不正确验证确认密码是否和密码一致
array('password','checkPwd','密码格式不正确自定义函数验证密码格式
当使用系统的方法创建数据对象的时候会自动进行数据验证操作,代码示例:
$User&=&D(&User&);&//&实例化对象
if&(!$User-&create()){
//&如果创建失败&表示验证没有通过&输出错误提示信息
exit($User-&getError());
//&验证通过&可以进行其他数据操作
通常来说,每个数据表对应的验证规则是相对固定的,但是有些特殊的情况下面可能会改变验证规则,我们可以动态的改变验证规则来满足不同条件下面的验证:
$User&=&D(&User&);&//&实例化对象
$validate&=&array(
array('verify','require','验证码必须!仅仅需要进行验证码的验证
$User-&&setProperty(&_validate&,$validate);
$result&=&$User-&create();
if&(!$result){
//&如果创建失败&表示验证没有通过&输出错误提示信息
exit($User-&getError());
//&验证通过&可以进行其他数据操作
同时也支持批量验证功能,只需要在模型类里面设置属性为(&默认为),设置批处理验证后,方法返回的错误信息是一个数组,返回格式是:
array(&字段名错误提示字段名错误提示
前端可以根据需要需要自行处理。
如果系统提供的规则不满足要求可以使用手动验证,新版增加了一个方法,用于个别需要的情况手动验证数据,支持部分自动验证的规则,用法如下:
check('验证数据验证规则验证类型
验证类型支持&,默认为结果返回布尔值&[1]
3.5.2&CodeIgniter的Model
CodeIgniter的模型建立和的有一定区别在中事务是建立在中的而没有强调这一点致使事务的操作许多人都写在了中使得并不标准同时的类使用更贴近原生在继承类后要先构造父类之后再写自己的函数更多的是符合语法而的封装很多脱离了的一些语法
下面介绍的使用仍然使用为例但是在里文件建在下类名首字母大写并继承模型类文件名是类名的小写版即可而不用再像一样添加后缀
application/models/usermodel.php
class&Usermodel&extends&CI_Model&{
&function&__construct()
&parent::__construct();//构造父类
如果需要使用数据库函数则要在构造函数里写入这样就可以使用的一些特有的数据库操作
在类里可以编写例如&一些函数还有一些特殊的查询操作之后再直接使用方法即可同时在里需要导入类才能使用类的操作
$this-&load-&model('usermodel');
这样就可以通过来使用自定义的数据库操作方法
第4章 特性比较
编译与非编译型
ThinkPHP是编译型框架他的模板引擎非常出色在网站在第一次执行的时候或者网页第一次打开框架会对项目文件进行编译编译后的文件放在项目目录下的文件夹下以乱码命名在使用中知道的视图模板文件时以结尾并且基本都是通过使用提供的内置标签进行操作比如等特有的标签对应的操作可以根据标签的英文猜测到含义其对应的都为语法在编译后的文件中可以看到
我们在模板里编辑如下
&foreach&name=&data&&item=&vo&&
--{$vo.id}--&br/&
--{$vo.name}--&br/&
&/foreach&
此处用的是的标签在控制器里编辑如下
class&IndexAction&extends&Action&{
&&&&public&function&index(){
$data=array(array(&id&=&&1&,&name&=&&A&),array(&id&=&&2&,&name&=&&B&));
$this-&assign('data',$data);
$this-&display();
在模板里打印的内容
在浏览器里可以看到显示效果
图视图数据测试
在编译后的文件里打开查看文件内容
&?php&if&(!defined('THINK_PATH'))&exit();&if(is_array($data)):&foreach($data&as&$key=&$vo):&?&--&?php&echo&($vo[&id&]);&?&--&br/&
--&?php&echo&($vo[&name&]);&?&--&br/&&?php&&&?&
可以看出标签最后的结果为语法中的循环并且在循环前对数组进行了判断之后进行打印
ThinkPHP&模板的功能非常强大可以自定义标签性质引入标签库在模板里注释也可以用和而不用理会模板扩展名为甚至可以在配置文件中修改定界符例如实例中的默认定界符为我们可以自定义符号比如在使用中就可以在这样使用原用法失效为了防止混淆尽量使用语法里没有的符号或符号组合同时也可以自定义标签库的定界符例如例子中的如果将定界符改为则必须这样使用标签库函数
在编译功能让人叹为观止的时候如果使用就会遇到语法被错误解析成的情况因为语法里筛选器中变量带有符如果和一起用就会导致被错误解析成变量所以一个简单的方法就是在和中间隔一个空格因为的模板引擎中连着是解析成语法的
同时还有两种方法可以避免这种情况一个是使用内置的标签包含代码,&literal&JS代码包含在标签中的代码将会直接输出,不进行任何解析,另外一个是定制模板引擎标签的定界符例如:这样就和Query代码区别开来了。
ThinkPHP的模板引擎中可以使用运算符可以包含文件可以使用函数功能非常强大
而是非编译型框架所以视图里的文件时以为扩展名里面使用原生语法例如输出变量用或者&即可没有过多的冗余
下面附上的编译过程
加载公共入口文件
在实例化类之前,我们需要首先加载系统的公共入口文件,这个文件是的总入口,让我们来一探究竟。在加载文件的过程中,其实完成了下面的操作:
?&记录开始执行时间&;
?&检测定义,如果没有则创建;
?&检测项目名称,如果没有则按照一定规则自动定义;
?&检测项目编译缓存目录定义,没有则取项目的目录;
?&加载系统定义文件和公共函数文件;
?&如果项目编译缓存目录不存在,则自动创建项目目录结构;
?&加载系统核心类库(包括、、、、、、);
?&如果版本低于则加载兼容函数库;
?&生成核心编译缓存;
?&记录加载文件时间&;
2、&项目初始化
在加载完成的公共入口文件之后,我们就开始执行应用了,而首先应该是初始化应用。
?&设定错误和异常处理机制(和);
?&项目预编译并载入;
?&设置时区支持;
?&Session过滤器检查;
?&session初始化;
?&检查并加载插件;
?&URL分析和调度;
?&获取当前执行的模块和操作名;
?&加载模块配置文件;
?&页面防刷新机制检查;
?&语言检查并读取对应的语言文件;
?&模板检查并定义相关的模板变量;
?&RBAC权限检测;
?&如果开启静态写入则读取静态缓存文件;
?&应用初始化过滤插件&;
?&记录应用初始化时间&
3、&项目预编译
?&加载系统惯例配置文件;
?&加载项目配置文件&;
?&加载项目公共文件&;
?&如果是调试模式加载系统调试配置文件&;
?&如果定义了项目的调试配置文件则载入&;
?&生成项目编译缓存文件;
?&检查当前模式;
?&如果存在变量,则根据当前的模式和设置进行重定向;
?&进行路由定义检测;
?&分析的信息到数组;
?&把得到的值和合并;
5、&获取模块和操作名
?&检查变量(包括和),如果未定义,则获取默认模块名;
?&检查组件模块;
?&检查模块伪装;
?&检查变量(包括和),如果未定义,则获取默认操作名;
?&检查操作链;
?&检查操作伪装;
6、&项目执行
?&AUTO_LOAD_CLASS&检查&如果有则导入公共类
?&实例化当前模块的控制器类
?&如果控制器不存在则检查空模块&
?&检查操作链,如果有执行操作链;
?&检查前置操作方法&操作名;
?&执行模块的操作方法,调度转移给控制器;
?&执行后置操作方法&操作名;
?&执行应用结束过滤器&;
?&如果开启日志记录,写入错误日志;
7、&执行控制器的操作
?&实例化视图类;
?&取得当前控制器名称;
?&控制器初始化;
?&如果操作方法不存在检查空操作&;
?&如果空操作没有定义则检查对应的模板文件;
?&调用模型获取数据;
?&渲染视图进行输出;
8、&调用模型获取数据
?&实例化模型类;
?&模型初始化&;
?&判断当前模型名称和对应数据表;
?&实例化数据库操作对象;
?&数据表字段检测并缓存;
?&查询需要的数据;
?&判断是否视图模型;
?&如果是延时查询返回对象;
?&取出数据对象的时候记录乐观锁;
?&获取文本字段数据;
?&获取关联数据;
?&对数据对象自动编码转换;
?&记录当前数据对象;
?&返回定义的数据格式(数组或者对象)
9、&输出视图
?&模板变量赋值;
?&检测是否是布局输出;
?&检测页面输出编码;
?&缓存初始化过滤&
?&页面缓存开启
?&缓存开启后执行的过滤
?&模版文件名过滤&
?&定位当前输出的模板文件;
?&模版变量过滤&;
?&根据不同模版引擎进行处理;
?&如果是模板引擎,直接载入模板文件;
?&使用内置模板引擎,检测缓存有效期;
?&缓存无效则重新编译模板文件;
?&载入模板缓存文件;
?&获取并清空缓存;
?&输出编码转换;
?&输出过滤&;
?&开启静态写入则写入静态文件;
?&如果输出则获取视图运行时间;
?&如果是则渲染模板输出信息;
?&开启页面则显示页面信息;
?&如果是则返回模板输出信息;&
ThinkPHP和两个框架对非爱好者来说是比较陌生的而程序员可能对其也进行过涉猎不过都是掠影在相关公司可能更多地是用公司自己的架构来编写网页和相关功能本文目的在于让爱好者更多的了解和的一些功能在自己使用中找到不足发扬优点填补缺陷
5.1.1&&使用习惯
论文通过将和的一些操作进行了实例的操作对一些基本操作也做了解释有些人更习惯使用的原生用法则建议使用框架而框架虽然对的一些语法进行了封装这也使得一些对不熟悉的人可以使用框架开发出不错的网站就像中框架一样使用高度封装的框架可以对程序语言本身不做太多了解即可使用
5.1.2&网站效率
ThinkPHP是编译型框架在第一次打开时会对页面进行编译这一过程可能没有打开的快但是编译后的文件是纯语法的文件虽然我们没有大型网站测试的经验但是多年的编程经验也知道编译后的网页打开效率是大于打开的效率的但是差别甚微基本可以被网速忽略同时这两个都是轻量级框架更轻量一些所以大型的网站建议不要使用轻量级框架会出现一些问题不在叙述
5.1.2&致初学者
对于初学者不建议使用框架编写网站这样会导致的语法混乱建议先熟练掌握原生语法后在使用框架进行学习
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:498894次
积分:5644
积分:5644
排名:第2026名
原创:103篇
转载:115篇
评论:86条
(1)(1)(6)(1)(11)(8)(3)(3)(1)(7)(2)(2)(3)(4)(3)(3)(4)(2)(2)(6)(29)(8)(1)(16)(3)(6)(8)(9)(19)(18)(10)(18)

我要回帖

更多关于 坦克世界插件站 的文章

 

随机推荐