- 论坛徽章:
- 0
|
从目前用到的最多的apache+php的搭配来讲,php和实质还是cgi。cgi就是程序或脚本设置环境变量&输入、加载、执行、输出、销毁。在这方面是与java web是截然不同的。
java web开发的核心是servlet和容器(jsp也被编译成servlet来运行),总的来说就是web程序员在实现servlet基类的子类,容器收到http请求后实例化servlet对象,负责管理servlet的创建运行销毁的整个生命过程。java的整个web是运行在一个进程空间内的(或jvm虚拟机),这样可以有很多方法提高系统运行效率,比如对象池,数据库连接池等。java里oo的应用是必然的。
php从形式上学习java那一套我认为是不可取的。一个http请求过来,php所有的对象都要从头读取加载创建,脚本结束后所有对象烟消云散。php解释执行的方式更不能跟JVM的JIT比较。
php的oo也不是一点没有用处。在php里,我认为oo主要用在功能性的包装上,比如adodb数据库对象,用户对象,复杂功能的form对象、html table对象等。
对应php整体框架来说,我个人认为更适合采用传统的过程方式,不要搞什么Application,Page对象。在使用顺序过程的方式的时候,要考虑几个重点问题。
1.一定要用单入口的方式,既面向用户只有一个index.php之类的单脚本。唯一入口从结构上可以集中处理url改写,任务分发,权限控制,防止恶意注入等(当然在不同页面里共同include一个集中处理的脚本也行,但那样失去了强制约束)。
2.OO里模块功能类和action方法转换为module目录和action文件。(这一点是我个人的习惯,不代表最佳方案)。用模块功能类(每一个模块功能写成一个类,分成若干action方法处理具体事务)的最大问题是:模块的规模不好控制。假设是一个论坛程序,我们会面临一系列抉择。显示子论坛,显示子论坛文章列表,显示内容,添加文章等功能,都需要划分若干类。从不同的视角,会产生不同的类的设计。有时候发现,虽然从逻辑上清晰合理了,但有的类几百行代码,有的类方法多有好几千行代码。单一代码多了可维护性降低,而且类中一个方法的语法错误,将导致整个类甚至程序的调用失败。
采用module目录和action文件的方式将解决(再说明:这不是电视里阿波罗活性肽的广告,只是适应我个人情况的方案)功能代码规模的问题。基本的url格式为:
index.php?module=mm1&action=show&xxx
入口合适权限后include module目录下的 module同名.php文件(相对于是类的构造函数,可以处理整个module的公共事务,网页的头部或网页的基本结构显示),然后 include module目录下的 {$action}.php。action文件可以是段php代码,也可以是嵌套php代码的html文件,这点很灵活。或是一段模板初始化代码,结尾处include 一个嵌套php代码的html模板(混合式的php本身就是最好的模板,为什么非一定要用smarty呢?)
3.权限。在基于第二点的情况下,权限就很好解决了。权限可以分为两种类型,一种是对应module和action的权限,一种是虚权限。对应module和action的权限完全是自动化的处理,在脚本或数据库里配置好后,由index.php入口自动判断处理(我个人目前实现了权限不够菜单和功能链接自动隐藏不显示)。对于action基本的粒度还不能满足的,使用虚的权限,直接通过if语句判断。
4.性能优化。php本身的运行方式和大量的include必然导致性能下降。针对php解释执行慢可以采用各种代码编译和加速的方式(eAccelerator,XCache等)。为了提供用户体验满意度,还可以采用ajax等技术。比如在index.php里直接输出含有ajax代码的静态主页面等。还可以借鉴smarty的“编译”方式,将页面里的include直接用include目标文件内容代替。当然这一变化是在index.php入口内部的处理,对用户透明不可见,不影响用户接口。
5.数据库对象
6.用户对象
未完待续。。。
任何应用框架必然带来的是某方面开发效率的提高和某方面灵活性的降低,挨砖是必然的,所以我也不敢发表什么框架。这里只是提出一些个人的心得和看法,偏颇也是必然的,愿与各位多交流促进。 |
|