《Modern PHP》——关于PHP的最佳实践和最新进展
先放本中文版封面镇楼
值得一读
在市面上各种 PHP 21 天从入门到精通的书已经漫天飞舞的情况下,《Modern PHP》一定是一本值得一读的从国内各大论坛/网站/课堂经历过以后的 PHP 进阶书籍。
《Modern PHP》是由 O’Reilly 推出,作者是大名鼎鼎的 Slim 框架的开发者。这本书推出的时间很有意思——2015 年 12 月,这也是 PHP7.0 正式发布的时间,同时——也就是从那时间开始,越来越多“PHP 药丸”的言论开始大行其道。所以,我一直在使用 PHP 的时候心情非常复杂。
不过,我想这本书是可以为 PHP 正名的,而且不仅仅是正名——这本书介绍了一个崭新的 PHP 和一个全新的 PHP 时代。 所以本文的题目差点被我起成卫庄体——“给我两个小时,还你一个崭新的 PHP”。
PHP 不是没有问题
首先,由于 PHP 的历史非常曲折悠久,所以网上有许许多多的 PHP 教程,但是教程良莠不齐,有许多陈旧的实践方式,又由于 PHP 变态的向下兼容性,那些实践方式都可以完美地不加出错地运行起来,这样便造就了无数的又慢又冗余又不安全的 PHP 应用。而许多 PHP 新的有用的特性又完全没有被很好地介绍给开发者。
特别是,有许多新进入 Web 开发领域的人都可以是用 PHP 轻易地写出虽然很脏很烂很难维护,但是又看起来运行起来没有什么太大问题的代码(比如我)。所以 PHP 开发人员入门门槛低是 PHP 的一个优势,但随之而来的开发人员素质无法保证也是 PHP 的一个劣势。
再加之国内一些 PHP 培训机构或者培训视频、社区、教程(这里就点名 w3school.com.cn 吧,里面的数据库连接方式全都是 PHP5,也就是 2004 年之前使用的方式)和开发框架(这里就只点名 ThinkPHP3 系列吧)所倡导的“能用就行”的 PHP 实践方式的误导…… 这些都让国内的众多开发者人为 PHP 已经垂垂暮矣,没有前途。
最差实践、最佳实践、最新现状
通过《Modern PHP》这本书的介绍,和我关于 PHP 的一些最新实践,让我看到了 PHP 的希望。
首先想罗列一下看起来恐怖(因为可能许多 PHP 开发者也都不知道)的 PHP 的新特性和新实践标准的名词——命名空间、接口、性状、迭代器、生成器、闭包、字节码缓存、反射、内置服务器、CLI 运行方式、PHP-FIG、PSR、组件化、PHP-FPM、XDebug、单元测试、持续测试、JIT 引擎、静态类型…… 俨然,PHP 现在已经变成了一门几乎无所不包(就像以前那样)的全新的语言。
说一下之前(或者说是很多教程里常见)的开发模式吧,首先用 PHP 的各种集成包在 Windows 下面搭建一个环境,如果想用框架的话就直接从官网下载框架的代码,拷贝到网站目录,然后新建一个 PHP 文件就直接开撸,磁盘的目录结构就是网站的 URL 路由,调试全靠满屏的 echo,遇到不会的东西就从百度随便搜索一个方案之后把代码拷贝进去直接去用(很多时候还和框架不兼容,所以就直接脱开框架自己开写原生代码),上线的时候打开 FTP 软件,直接把网站拷贝进去齐活。 简单,的确非常简单,而且粗暴。但是这里面藏匿着很多问题,比如文件引用、路由配置、定位 bug、单元测试、性能分析、自动化部署、版本控制、包管理与更新、性能优化、日后维护……这种各自为战的方法,也同样很不利于社区的发展。
而这本书里讲述了一种完全不同,甚至优雅程度不亚于现在比较流行的语言的 PHP 实践方法,这里就类比 Python 吧。
- 使用统一的代码风格,类似于 Python 的 PyLint,PHP 有了使代码符合 PSR 规范的 PHPLint
- 优秀的包管理,类似于 pip,PHP 可以使用更加优雅的更加细化 Composer 进行包管理(而且 Composer 还有插件可以顺便充当前端的 bower 或者 nmp 包管理器)
- 统一的 autoloader,在 Composer 中自带了符合 PSR-4 规范的 autoloader,终于结束了各种 autoloader 版本的时代,而 Python 则需要在init.py 中做些手脚
- 迭代器/生成器,使用起来就和 python 的 yield 一样
- 匿名函数/闭包,就像 Python 的闭包和 lambda 表达式一样(但是闭包的作用域需要 use,不是很习惯)
- 内置服务器,就像 Django 或 Flask 一样可以直接以 CLI 的形式启动内置服务器进行测试
- PHP-FPM,就像 uwsgi 一样是一个 fast-cgi 的托管器
- CLI 运行方式,只要愿意,PHP 可以写出像 Python 一样好用的命令行脚本
- 版本控制,PHP 也可以使用 Git 或者 Subversion 等软件进行版本控制
- 流的概念,这里很像 C#中的 stream,可以有多级 Pipeline,也可以通过继承让不同的流支持统一的接口
- 性状的支持,这个在 Python 里似乎没见到过,比较有意思,不过 Python 可以有多继承来完成和性状类似的事情
- Zend OPcache,完成了类似 Python 对 pyc 文件的缓存
- Travis CI 也支持 PHP,可以完成持续测试
- JIT 引擎——HHVM,性能提升很高,Python 也有类似的解释器(据说 PHP8 的 Zend 引擎也会加入对 JIT 的支持,拭目以待吧)
- 静态类型,Hack 和 PHP7 均支持,(可以选择声明类型 or 不声明类型),这使得 PHP 更加类似强类型语言,Python 目前应该还没有相关特性(但 Python 是强类型语言),这和 C#目前的思路有写相对应(C#可以使用 var 或 Object 做类型推断,实现一些感觉像是弱类型的功能)
- 性能提升——HHVM 和 PHP7,理论上的说,都比 CPython 快得多
- ……
所以,PHP 完全可以继续作为一门可以和现代大多数语言媲美(甚至更加完善)的 Web 开发语言(甚至可以是命令行脚本开发),而且 PHP 依旧具有旺盛的生命力。
GitHub 中一些有趣的 PHP 项目
- ReactPHP——PHP 版本的 NodeJS:https://github.com/reactphp/react
- Swoole——使用 C 语言拓展的 PHP 异步、并行、高性能框架:https://github.com/swoole/swoole-src
- WorkerMan——一个纯 PHP 开发的高性能 Socket 框架(完全可以当做 WebServer 来使用):https://github.com/walkor/Workerman
- Yaf——使用 C 语言拓展的高性能的 PHP 框架:https://github.com/laruence/yaf
- Hprose for PHP——使用 PHP 语言开发的跨语言远程通信中间件:https://github.com/hprose/hprose-php(当然不仅仅有 PHP,还有各种语言,和 Thrift 非常像)
放弃旧的思路,开始新的 PHP 之旅
试着使用《Modern PHP》中的最新实践,多去看看国外的 PHP 社区和一些主流的 PHP 框架的 PHP 实践方法。 如果无从下手,建议抛弃陈旧的 PHP 教程,从使用 Composer 和写符合 PSR 规范的代码开始吧!在那里,会见到一个全新的有生命力的 PHP 社区。
一些资料
- 作者 Josh 维护的社区——PHP 之道:https://laravel-china.github.io/php-the-right-way/
- ModernPHP——豆瓣:https://book.douban.com/subject/26635862/
- ModernPHP——O’Reilly:http://shop.oreilly.com/product/0636920033868.do
- PHP 包社区:https://packagist.org/
- PHP 官方手册:http://php.net/manual/zh/
- PHP-FIG 官网:http://www.php-fig.org/
- 一些流行的 PHP 框架:Laravel,Symfony,Yii,Slim
- 正版 W3School(可能需要梯子):http://www.w3schools.com/php/
- Laravel China 社区:https://laravel-china.org/
- 鸟哥(PHP7 主要开发者)的博客:http://www.laruence.com/