我使用PHP语言已经有很多年了。在过去的几年中,虽然并不曾用PHP开发什么大项目,但一直都在用PHP做一些小东东,并关注PHP的发展。为什么PHP语言如此让我关注呢?原因有两个:
PHP是一个开源语言,其语言与库都是开源的。而且其有成熟的开源社区,这对于技术开发者而言是极大的支撑; PHP是一个完全面向Web开发的语言。PHP对于Web开发的专注,使得这个语言在Web开发上具有其它语言所不能比拟的一些优势。比如PHP既能编写羽量级的Web网站,也能支撑超负载大规模的Web应用。PHP在Web上有许多清晰而简洁的解决方案,这是许多通用语言所不能比的。比如我所喜欢的另一个开源语言Python,其也能用于开发Web应用。但Python的目标显然不限于Web开发,因此在Web开发方面Python的生产力并不比PHP强。
虽然上述都是一些个人观点,但从实际应用上看,在Web应用中,PHP显然是最流行的语言。许多知名网站都建筑在PHP上。
前几年我所经历的Web开发,仍集中与.Net平台上。所以对于PHP,仅仅作为个人珍爱,并没有多少实际项目应用。但从今年开始,随着软件开源趋势的发展,在Web端采用PHP的项目也多了起来。我的几个朋友都在进行PHP项目的开发,这在几年前是难于见到的。我是很高兴看到这一变化的。开源的发展势必深刻影响软件业的发展,这样更多更丰富的软件资源将被生产出来,我们将面对不再是“Wintel”世界,这很好......
因此我将这些年的一些PHP技术笔记整理出来,作为一个界石放在自我Web开发之路上。在该石之前是点滴零碎的PHP爱好者,在此石之后我将更深入地探索PHP技术,在PHP世界中深耕细作。
PHP基础语法印象PHP是一个应用型的语言。它从多个语言中获取灵感,包含许多语言特质。因此对于熟悉 C、C++、Java等语言的人来说,PHP语言很好学。而且其采用了一种最直接的嵌入方式?? 。这种嵌入方式最大程度地保留其与HTML和XHTML的接触度,从工程角度上看是极其经济的。正因如此,当年PHP出现后,MS即可将这种方式引入IIS中,开发出ASP语言。
当然直接嵌入的方式也存在许多问题,其最主要的是无法做大。小打小闹的HomePage可以,但多人团队操作的Web应用程序则很困难。PHP从C/C++中借鉴了 include 方式,基于include、require、require_once等关键词来进行多文档关联。而在PHP4/5中,更强调前后台之间的分离,采用MVC设计模式来构建Web程序。经过多年的发展,PHP语言已经可以胜任大型Web程序的开发。
我认为PHP语言的核心,应该是:
库和框架: 引用在C/C++中的经验,库学习是PHP中的核心。PHP中有两类库??核心库(Core)和拓展库(Extend)。核心库中对于字符串操作、数组操作、日期操作与正则表达式操作应该由其用心,这些库很多是基于Web UI的,而Web程序的输入输出是很关键的技术,其涉及许多安全与稳定方面的问题,也涉及用户体验等问题。而拓展库是方便开发的。PHP具有丰富的拓展库资源,不论是PECL拓展还是PEAR拓展,或是sf.net上的众多PHP程序模块,都是可以挖掘借鉴的财富。而一些成熟的库或程序,已经成为一种稳定的框架,如Smarty和Drupal。利用这些框架,可以极大提升项目开发速度与质量;阅读这些框架,可以极大提升自我PHP方面的功力。在库与框架上花费时间与精力是最值得的。 OOP开发与设计模式:虽然直到PHP5才支持OOP设计,但在PHP4中可以采用"回调函数(callback function)"等来模拟类的动力学模型。而现在OOP开发已经成为基础技术,不论是多人的大型项目程序,还是单人的小程序,都应当采用OOP的方式进行。PHP最简单的回调函数就是一个函数变量,样例如下。
PHP技术快速一览
我将这几年积累的PHP技术进行一些分类整理,其主要有:
字符串库:在Java、.Net中都有类似的字符串处理函数库,需要注意的是Unicode字符处理库 mbstring 拓展库; 数组处理:与C/C++所不同的是,PHP数组处理技术非常的复杂,其与页面效率密切相关。比如要用shuffle()或array_rand()来随机抽取元素;尽量用foreach而不是用for来遍历数组。更重要的是,PHP数组承担了配置对象与存储对象的作用,在许多库或框架的使用前,都要设置一个配置数组来进行自定义配置; 日期与时间:需要注意其适用场所,并不一定要详细其在毫秒级别上的数据,其效率很可能与服务器和网络环境有关。因此对于PHP程序测试,应该采用客户端的Javascript来进行计时,其与PHP服务器端的计时相对照会更有用; 正则表达式与服务器变量:在PHP中,正则表达式与服务器变量是用来防止攻击,对HTTP访问进行过滤与校验的最基本工具。我的做法是在开发前,开发一个基于正则表达式与服务器变量的myFilter类,该类用于过滤信息,实现最基本的防护作用; 数据库:要深入学习数据抽象层技术,对于 metabase/PEAR:DB/PDO和ADODB等抽象层库有充分的了解。这样数据库程序才能有良好地移植能力。我选用ADODB,主要原因是其与.Net架构有相似性,并且能支持Python。 会话管理:在Web2环境下,Cookie的管理比Session更重要。对于PHP项目中的核心业务步骤,不采用Ajax方式,用Session进行管理;对于其它非核心的业务(主要是查询),可以采用Cookie方式,将部分Javascript程序下发到Cookie中,非常有利于提升客户体验。 国际化与本地化:PHP项目中应坚持用Utf-8编码(页面与数据),而且在编写程序UI时,应采用 gettext 扩展库进行多语言支持。我的做法是基于Drupal框架进行PHP开发,充分利用Drupal提供的t函数方式进行国际化与本地化。 缓存与加密:PHP有很好的缓存技术与加密技术,相关的库有ob_库、MD5、SHA1、Cracklib拓展库与mycrypt拓展库。利用缓存与加密技术,可以有效提升系统性能,特别在进行核心数据处理方面。而对于用户体验方面,我的侧重点在于采用Ajax技术与Xml相结合方式; 其它技术:PHP的Shell技术可以实现部分系统业务的自动化;而利用Curl库可以制作一些自动爬虫程序,用来进行单元测试与数据挖掘工作;PHP对于图像处理有很好的技术方案,GD2、Ming与ImageMagick都是很好的选择。