您好, 访客   登录/注册

PHP开发框架关键技术分析

来源:用户上传      作者: 胥立 崔伟 黄林

  摘要:本文在分析主流Web架构的基础上,讨论了PHP开发框架涉及到的几种主要技术:MVC设计模式、模板解析引擎和数据访问层及其在PHP中实现的主流方式和优缺点,给出了基于被动MVC、模板解析技术和Table Data Gateway模式的数据访问层来实现轻量级的PHP开发框架的解决方案。
  关键词:MVC;模板解析引擎;数据访问层;PHP
  中图分类号:TP311.52 文献标识码:A 文章编号:1007-9599 (2012) 20-0000-02
  1 引言
  PHP是在服务器端执行的脚本语言,具有简单易用、执行效率高和跨平台性好等优点,是目前最受欢迎的Web开发语言之一。然而,由于PHP5之前的PHP版本对面向对象支持不完善,导致PHP的开发框架研究从PHP5发布后才逐渐展开、在发展过程中又受到Structs和ROR框架的严重影响,没有充分考虑PHP语言的特点,造成在PHP领域,框架的普及情况远远不如Java领域。PHP框架的研究首先要解决的是采用何种Web架构的问题:
  2 Web开发架构
  简单的说,Web开发实际上是通过将HTTP请求发送给服务器端脚本,通过服务器端脚本对数据库进行数据管理。Web架构即是Web系统中服务器脚本以及HTTP请求的组织形式。目前流行的Web架构有以下三种:2.1 基于文件/参数。传统的Web系统中,服务器脚本根据功能不同分别存储在不同的目录中。服务器脚本的路径与URL地址相对应。HTTP请求通过URL直接指向某个服务器脚本,并在URL后附上特定的参数,以提供脚本执行所需的数据。脚本article.php执行完毕后将执行结果响应给用户。这种是一种面向过程的开发方式,较为简单直接。在小型的Web系统中应用较广泛。但由于在URL中附加参数,因此基于文件/参数的方式不利于搜索引擎收录,同时各文件相对独立的处理HTTP请求,因此也难以实现系统的集中控制。2.2 基于控制器/动作。随着面向对象的成熟,Web系统逐渐引入基于控制器/动作的开发方式。这种方式通常使用一个路由模块解析HTTP请求,并调用适当的控制器(或控制器中的某一个动作)对请求进行处理。MVC设计模式是基于控制器/动作的一种典型实现。与基于文件的方式一样,基于控制器/动作的架构也是建立在请求/响应驱动的基础上。2.3 基于组件/事件。基于组件/时间的Web系统与桌面应用程序相似,通常将Web系统分为多个组件,各组件可以触发特定的事件并由事件处理器处理。这样就可以将HTTP请求抽象后映射到事件上。.NET是典型的基于组件/事件的Web框架。其代码重用能力很强,开发速度也很高。但这种方式往往要求完善的控件支持和强大的IDE开发环境。在缺乏这两个条件时,其优势难以发挥。
  3 PHP与MVC模式
  3.1 在PHP中实现MVC的特点。MVC模式通过分离数据、逻辑和显示,将Web系统中的数据处理、流程控制和数据展示强制性的分为模型、控制器和视图三大部分。三者通过控制器结合在一起。从而从根本上避免了传统的Web开发方式中存在的显示、逻辑和数据相互缠绕的问题,使得程序结构清晰而灵活[2]。MVC模式要求在跨页面的脚本中实现模型和控制器互相通信。然而由于PHP对象在页面执行完毕后即被回收,因此PHP对象无法跨页面存在,传统的MVC架构在PHP上无法完全实现。通常解决方案是在回收前将对象存入数据库或SESSION中,需要时在从数据库或SESSION中重建对象。这种方式由于需要频繁读写数据库,显然效率较为低下。基于PHP对象无法跨页面存在的现状,在PHP框架中使用被动MVC模式更为合理。在被动MVC中,模型以普通对象的形式存在,与MVC结构的其他部分没有关联。这样既可避免对象跨页面的问题,避免了MVC模式带来的效率下降。3.2 视图层。Web项目扩大带来的众多问题中,前端设计团队与程序设计团队的协作、维护和扩展难度的控制是两大难点。分离页面设计与程序逻辑是最有效的解决方案[3]。在PHP Web开发中,通常采用模板技术分离显示和逻辑。对应于MVC,模板解析引擎通常处于视图层。模板解析引擎提供相对简单的模板语言[4],以支持前端设计人员编写HTML模板。模板解析引擎可以讲HTML模板编译成PHP脚本后直接运行。总的来说,PHP框架的视图层通常采用类似Smarty的模板解析引擎驱动,以相对简洁的模板语言或直接采用PHP语言在模板中实现显示逻辑,从而实现业务逻辑和前端展示的分离。3.3 数据访问层。开发框架要解决的另一个主要问题是在系统中将业务逻辑和数据相互分离。通常是使用数据访问层将程序与数据库分离。数据访问层一般采用数据关系映射(ORM)实现逻辑和数据的分离。ORM使用元数据描述对象和数据库之间的关系,并映射到数据库中[5]。由于程序对象和关系数据库的映射较为复杂,因此会造成比较严重的效率降低。从PHP5开始,ORM逐渐被引入到PHP开发框架的设计中。但现有的PHP ORM项目虽然都基本实现了对象关系映射,却普遍存在结构复杂、效率低下的缺陷。
  为降低数据访问层的复杂性,在PHP框架设计中活动记录模式(ActiveRecord)逐渐开始流行。ActiveRecord将每一条数据记录都包装为一个对象实例,这可以极大的提高数据库相关程序的开发速度。然而,这种方式在处理关联表时,即使只提取一条记录,与之关联的所有其他记录均会被包装为对象实例,这将会造成效率的急剧下降;对于需要频繁更新数据的场景,由于所有的数据均需被封装为对象,更新对象属性后将对象存入数据库才能完成数据更新。显然,在数据访问层中使用活动记录模式的效率仍不理想。
  对于轻量级的PHP框架,对数据库的操作跟适合采用更简化的数据库访问层方案。与活动记录模式相比,表数据入口(Table Data Gateway)模式仅对数据表实现封装,而不是对封装每一个记录行。与PHP强大的关联数组相结合,表数据入口可以高效、灵活地操作大量数据。由于不对记录进行封装,因此表数据入口操作的是纯数据,而非封装了数据的对象。表数据入口模式可直接对数据库进行操作,这就决定了表数据入口模式具有很高的数据操作效率。
  相对于 Active Record 模式,Table Data Gateway 模式在数据表层面上封装数据操作,更为简洁清晰,适合在轻量级的PHP框架中使用;由于复杂性降低,也可以大大降低用户的学习成本;表数据入口不封装记录,因此可以直接操作数据库,且表数据入口模式中的数据以数组的形式保存,利用PHP关联数组的优势,执行效率比活动记录模式高得多。总的来说,轻量级PHP开发框架的数据访问层使用表数据入口模式实现,执行效率更高、学习难度更低。
  4 总结
  总之,随着PHP语言的发展,尤其是PHP5在面向对象支持上的巨大飞跃,使得在PHP上实现MVC模式成为可能,但PHP语言的固有缺陷决定了完全的MVC模式在PHP上的效率较低且不易实现。较好的解决方案是基于被动MVC、模板解析技术和Table Data Gateway模式的数据访问层来实现轻量级的PHP开发框架。
  参考文献:
  [1]贾广宇.MVC设计模式下Web开发框架的研究与应用[D].大连:大连海事大学,2006.
  [2]任中方等.MVC模式研究的综述[J].计算机应用研究.2004.10:1-4.
  [3]曾楠等.基于MVC模式的嵌入式Web设计方法[J].厦门大学学报.2006.2:196-198.
  [4]仝戈,张武装.Smarty在基于MVC框架的Web应用程序开发中的应用[J].科技信息.2009.31:839-840.
  [5]陶勇,李晓军.Hibernate ORM最佳实践[M].北京:清华大学出版社:2007.22-25.
转载注明来源:https://www.xzbu.com/8/view-4079276.htm