在进行开发之前,仔细研究了部分已经出现很久的php(Hypertext Preprocessor)框架,分别是yaf(Yet Another Framework),yii(Yii Framework),tp(Thinkphp Framework)。对这些框架其实都不合适进行这套系统的开发,下面是对他们的分析。
yaf是一个开源的php框架插件,也是在工作时接触到的第一个php框架。使用时候的第一感觉就是,什么都有,却也什么都没有。yaf提供了模型-视图-控制器三层架构分离的实现方法,同时对一些调用过程进行封装,让编程模式完全面向对象。yaf框架总在强调它有多好,多快,但是却忽略了php本身的缺陷:即时编译。无论是.net,java,python,nodejs,这些程序在担任服务器程序的时候都做到了同一个特性,即只在服务器开始的时候编译一次,之后所有操作都是在内存中完成的,除非必要的io交互,但绝对不会对程序代码进行即时编译执行。php做不到这点,因为php的所有程序的生命周期是从收到客户端请求开始,到响应请求完成结束。所以单靠框架无法解决这根本的问题。此外yaf有用的功能真的太少了,对于框架而言,如果仅仅实现了三层架构分离,那对开发者实际上意义并不大。
yii是一个php代码写的框架,打个比方来形容,php就好比是小麦粉,而yii则是干脆面。yii在php的原生方法的基础上,封装了一些被称为“添加剂”的东西。比如说,在原生的php代码中想要获取到用户提交上来的参数数据,可能会直接使用php提供的全局变量获得原始数据,而在yii框架中,则可以使用yii封装之后的数据,串行化的数组可能已经被yii转义成php可用的实体数组。添加剂虽然能够改变平淡的口感,但是用多了也会让人降低食欲。严格意义来说,php这门语言并没有做到真正地面向对象。在完全面向对象的java语言中,三层架构里的模型层都是直接和数据关联的。php做不到这点,自然yii也做不到。这就导致了虽然yii的写法看似都是对象调用,实际上都是程序代码被用到后即时编译,然后类代码实例化成“对象”的结果。这种对象的生存周期并不符合符合现实逻辑,此外yii框架的源代码非常庞大,却也非常琐碎,这导致每次收到一个请求后,服务器上往往需要引用十几个php代码文件才能给出响应。上一段说了,从硬盘读取速度是很慢的,一是寻路慢,二是读取慢。php设计之初的目的就是为了快,开发快,执行快。yii这样做在实际违背了php的初衷。
最后说说tp。tp的名字早有耳闻了,但是一直不愿意接触,因为太长的代码阅读非常困难,尤其是框架代码。很多问题更愿意思考自己会如何解决,然后再去比较是否与现有的解决方案哪个更好。大道至简,框架是为了减轻开发难度而诞生的,如果使用一套框架的学习成本太高,否定这套框架是必然的。tp的学习成本太高,大部分api都是单字母的,如果不阅读官方文档没法看出这句话做了什么,再加上官方文档说明不够直白,使用tp必然是一个大坑。
因此实际上开发时选择自行设计mvc框架,实现目的如下:
1) 三层架构完全分离,提高开发过程效率
2) 安全,不论xss,csrf,还是试探型攻击,全都在框架层作统一处理。并且绝对不使用存在安全隐患的方法。在tp框架3.2.3中,Common/functions.php里定义的get_client_ip方法使用了不安全的判断方式,逻辑顺序优先获取可以被伪造的HTTP_X_FORWARDED_FOR和HTTP_CLIENT_IP,虽然对格式进行了判断,但是还是有伪造的风险,如果一个网站试图用这个方法来区分来源用户那么很可能导致一次伪造身份攻击。
3) 目录结构清晰,让人一眼就能看清楚程序架构的层级关系 php+mysql排选课系统设计+文献综述(3):http://www.751com.cn/jisuanji/lunwen_32758.html