进阶PHP需要注意的一些点

最近写了一段时间PHP,发现了不少以前没有注意到或者意识到的事情,写一篇记录分享一下。PHP进阶一定要注意这些事情。

用好PECL

PECL(The PHP Extension Community Library),PHP官方提供的PHP扩展库。这个主要可以解决社区和第三方提供的PHP扩展的安装问题。早些年看张宴老师的PHP编译部署的文档,生产环境的PHP扩展安装从那时起都是从网站上下载,然后自己编译安装。后来PHP版本升级后,原来文档里面提供的扩展包已经不能匹配新版PHP环境了。其实PHP一直都有PECL这个工具用来管理第三方扩展,使用起来非常方便。

在Linux/Unix/MacOS上,使用PECL是一件非常方便的事情。如果你的PHP环境是自己编译的,在PHP的安装目录的bin下会有pecl这个文件,把它软链到/usr/bin下面你就可以随时使用pecl了。以下给出两种软链它的方案,Linux发行版推荐使用alternatives工具。

我的PHP安装在:/usr/local/php-5.5.10

alternatives安装方式

soft link安装方式

注意你可能需要管理员权限才能进行此操作。

在Windows上同样可以使用PECL,但是不如Linux/Unix系统上那么无痛。有相当多常用的扩展并不提供编译好的.dll,而且要在Windows上自己编译PHP扩展,现阶段来看,称其为一场灾难也不为过。要做到VC版本、x86/x64、线程安全/非线程安全版本的完全匹配,一个版本的扩展至少要产生8~12个版本的DLL。

使用PECL非常简单,常用的命令包括list、search、install、uninstall。

list命令可以帮你查看当前PHP环境已经安装的扩展:

search命令可以在软件仓库中查找需要的扩展软件包:

如果你要安装mongo的扩展,那么直接执行:

即可搞定,多简单!

需要注意的一点是,PECL并不会替你修改php.ini文件,所以使用pecl安装扩展后,请编辑php.ini文件增加配置使扩展生效。

拥抱PHP 5.3+

貌似很多国内项目还在坚守PHP 5.2,老项目的迁移抛开不说,如果你正准备进行一个新的PHP项目,那么请将你的默认PHP版本升级到5.3.8以上,推荐直接升级到PHP 5.5。为什么要这样做?首先是更加完善的面向对象支持,PHP 5.3开始支持命名空间,这一特性对现在社区的库和扩展来说是一项最起码的要求。如果你还打算继续使用PHP 5.2甚至更老的版本,那么恭喜你只能望Composer兴叹了(下面会告诉你Composer是个多么令人惊奇的东西)。另外就是新版本的安全性和性能会更好。(PS吐槽:总有人认为老版本更稳定或者给更安全,美其名曰经历过实战检验——这群人的万能挡箭牌。呵呵。)

PHP 5.3开始支持命名空间,同时也由此诞生了psr规范(什么是PSR?传送门)。有了这一特性之后,我们终于有了普遍适用的类和文件加载机制,再也不用关心使用类之前是否require过,或者费心使用各种框架五花八门晦涩的组件加载方法了。

PHP 5.4开始支持了数组定义的缩略写法,以前我们定义一个数组通常是这样的:

大家用JS就会发现这种写法其实不够简洁,于是PHP5.4开始支持了类似JS的这种写法:

另外,PHP 5.4开始,支持了方法参数的强制类型定义(以前只支持array),这对提高代码的健壮性和IDE支持有了很大帮助:

关于PHP 5.4中支持的新特性,请参考:http://www.php.net/manual/zh/migration54.new-features.php

 

当然,一些特性不再必要,或者受支持,请参考:

http://www.php.net/manual/zh/migration54.deprecated.php

http://www.php.net/manual/zh/migration54.incompatible.php

在PHP 5.5中,有更多的新特性被支持,比如empty开始支持表达式了,新版本现在开始支持yield关键字了。如果你对.net比较熟悉,那这个对你来说一定不陌生。

关于PHP 5.5的新特性,参考这里:http://www.php.net/manual/zh/migration55.new-features.php

当然,一些特性不再必要,或者受支持,请参考:

http://www.php.net/manual/zh/migration55.deprecated.php

http://www.php.net/manual/zh/migration55.incompatible.php

使用Composer

Composer绝对是一个令人眼前一亮的东西,它更像是PHP的Maven。现在一门编程语言,得社区者得天下。Java的广泛应用,功劳肯定离不开数以万计的社区项目支持。你要开发一个模块,还继续自己先造轮子吗?No,Composer已经为你提供了数以万计的轮子供你挑选,现在要做的,就仅仅是从一些漂亮的轮子里面挑选合适的放在你的项目里,而不是写一些未经严格测试的代码就作为系统的基础类库。

关于Composer的介绍,请参考我之前写的一篇文章:传送门

做一件事情,现在只需要往composer.json中添加一个合适的库依赖,然后使用composer update,这些天降神兵的家伙就加入到你的项目中了。我现在使用了这样几个组件,通过composer安装:

  • Doctrine ORM – 一个PHP的ORM框架,下面会讲到。
  • php-resque、php-resque-scheduler – 一个PHP的后台任务处理框架、计划任务框架。
  • phpexcel – 老牌PHP处理Excel的组件
  • image – 一个PHP的图像处理库

我要做的仅仅是写几行类似胶水的代码,把这些类库粘接起来。其他的事情全部交给开源社区了:-)。

别被框架绑架

不能不说,如今PHP开发不整一个框架,都不算会写PHP。有那么多框架可供选择:Zend、Symfony、Yii、CakePHP等等,但是千万记得别被框架绑架。这句话有两个方面的意思,首先,别让框架把简单事情复杂化。PHP论性能不如Java,论语法糖不如C#,论灵活性扩展性不如Python、Ruby这些家伙,那为什么还用PHP呢。我觉得仅仅是因为,KISS原则:Keep it simple, stupid. PHP要实现一个功能很简单,可能Java搭建框架的功夫,PHP就已经交付了这个功能。开发迅速,维护简单是他的优势,别让框架把它搞复杂了。其次,如果一个设计,框架不支持,或者做不到,不要想当然的以为PHP也做不到,这就错了。别忘了你有Composer:-)。但是如果一个框架不能够很好的支持社区组件,那么是时候把它扫进垃圾堆了。

Doctrine ORM

这家伙实在是不得不说它了。按照我以前的想法,PHP存在ORM这种东西完全是找虐。用过了Doctrine ORM才彻底改变了我的想法(其实不得不提的是之前做了接近一年的Java,JPA、Spring Data神马的已经开始依赖了)。

新的项目使用了我自己写的SimplePHP框架(传送门到GitHub)。但是业务领域还是有一些复杂的。为了便于以后的开发和维护,也为了团队协作更加方便(关于领域和数据访问层的设计,请参考《企业应用架构模式》这本书。),我决定尝试一种PHP的ORM框架。在Composer上找了一下,发现Doctrine ORM使用最多,果断尝试一下。刚刚读完入门指南,我就立即发现,这货完全就是PHP版本的JPA,连API都非常接近。

SimplePHP可以很好地兼容PSR-0,所以直接通过Composer安装,简单配置一下即可:

Conf/db.conf:

我写了一个简单的工厂类,来帮助从配置文件产生EntityManager对象,在业务逻辑类里面可以直接使用:

来取得EntityManager对象。

项目开发证明,Doctrine ORM非常必要,它带来很多方便的特性,重要的是,Doctrine ORM性能也还不错。

通过注解方式配置的POPO(对应POJO),可以直接从领域模型快速建出,并且无需关心数据库建表,这一切都会有Doctrine的Tools帮你建立。甚至代码有了修改之后,都能自动地更新数据库表结构,简直不能更爽了,哈哈(PS:其实JPA一直都可以好嘛)。

基本上要说的也就这几点了,作为一点点经验分享给大家。

进阶PHP需要注意的一些点》上有1条评论

评论已关闭。