这是一篇社区协同翻译的文章,已完成翻译,更多信息请点击 协同翻译介绍 。
文章的标题真是自命不凡,不是吗?是的,虽然我们使用 PHP 工作很多年,但是我们能够说出哪些是最佳实践和最好的工具吗?我不能,但是我将要去这么做。
我看到开发者们使用 PHP 工作的方式正在发生真正的变化,不仅因为 PHP 新的版本和自身逐步的完善,让 PHP 语言发生了巨大变化,变得更加成熟和健壮,更重要的是整个生态系统也在不断地改变。
为了使代码更优雅和更易于理解,人们创造了新的工具、库、框架和文章,定义了新的设计模式。一些人还在思考如何让工作(和开发者的生活)变得更具生产力,更简洁和更有趣。
我不是一个新趋势的早期追随者,实际上,我只会在一个新工具有了社区和我认为它能改善我的工作后才会去使用它。我经常做的仅仅是尝试采用最佳实践来写代码。
所以,我花了一段时间以后才开始使用 Composer 和 PHPUnit 等工具。大约一年以前,我才向这些闪亮的新事物敞开了心扉。
先是 PSR,然后是 Composer,PHPUnit,Travis-ci 等其他几个库和令人惊奇的工具。我甚至已经开始使用 IDE 了(Vim FTW,但是配置了 XDebug 的 PHPStorm 才是一个明智的工作环境)!
什么是现代化?
作者: Karen Roe (Flickr) [CC BY 2.0 (http://creativecommons.org/li...)]
网上有大量的文章说 PHP 多么可怕,从事 PHP 编码工作会让你的生活多么糟糕,语言是多么丑陋以及你能想到的任何其他东西!
如果你打算使用遗留代码,可能你的生活不会太好,但是如果你有机会参与一个新的项目并且能够使用所有的新工具,那么你将会看到我要讲的这个新的 PHP 。
我每天都会用 PHP 处理一些问题,但是人们无法关注语言、社区以及生态系统所发生的变化 。虽然还有很长的路要走,但是 PHP 领域的事情正在变得越来越成熟。
我开始为我工作的公司创建一个内部 API 的 SDK,例如一个宠物项目,并且决定遵循最佳实践。大部分事件我已经在做了,但是我在做某些事情的时候做了一些改变。这些改变以及我去年学到的知识是本文的主题,我称之为现代化 PHP 。
我们从工作流程开始
如我所说,我刚刚使用 IDE 没有多久,但是自从用上了 IDE ,我就喜欢上了。PHPStorm 是软件中的顶级杰作。它将会是我的第一个也是此后唯一一个 IDE 。它是我的首次尝试,它好到我没有必要再去尝试其他的IDE。
集成的 XDebug 简直完美,还有 PHP 命名空间解析、 composer 、git 、代码自动补全、代码生成、代码重构。让我说三天三夜都说不完。
我不认为你必须使用 IDE ,实际上,这完全是个人观点。你需要使用诸如此类的符合你的需求的,例如:Vim 、Atom 、Emacs 、Bracket 、NetBeans 、 PHPStorm 、Eclipse ,等等。很重要的两点是生产力与人体工学。你的 IDE 或文本编辑器必须是协助你工作的,而不是拖累你。
然而,对于我来说,很重要的一点是对于调试功能的集成。写一个大型项目(其实小项目也一样)你需要一个很好的调试工具。让我们忘掉那些var_dump
和print_r
。你需要在代码运行时设置变量的值、分析堆栈、设置断点。 这些才是至关重要的,它们使得开发和重构更加容易。
我甚至不知道是否还有其他的选择,XDebug 拥有你所需要的一切。你现在有时间吗?如果你还没有做过这些事情,请花一点时间安装 XDebug 并把它整合到你的 IDE 里吧。从现在开始使用正确的工具来调试你的代码。
另一个我想让你引起注意的工具是 Github。可以写一大篇文章来介绍 Git 和 Github 有多棒,以及你为什么必须开始使用版本控制来管理你的代码,但此处我想为你展示另一个原因。
这里的重点就是 integration (GitHub Integration,译者注)。
Github 中还整合了其他几个工具,并且你应该开始使用它们。在持续化集成过程中,这些工具可以为你生成数据,跑测试,跑任务,在你的工作流中为你做各种各样的事情。Integration 是你开始使用 Github 的一个很好的理由,其他的事情都可以暂时靠边站。
依赖管理
现代 PHP 生态的另一点就是依赖管理,Composer 也由此而生。
Composer 已经5岁了,但大规模应用还是近两年的事。这大概是我没有及早使用,或多数 PHP 开发者流连现状造成的。
它是 Packagist 的终端,而 Packagist 是 PHP 包的仓库,由 PHP 库、项目以及工具组成,源码保存在 Github (或 BitBucket 等)。
本文谈及的所有第三方库,都可以轻松地添加到你的项目中。
$ composer require package_vendor/package_name
要是不知道第三方库的名称,可以使用 search
查找。
$ composer search package_name
Composer 是管理依赖的不二之选,但绝不仅于此。不妨花点时间安装 Composer,阅读其 文档。
处理得当的命令行界面
我真的愿意尝试快速使用 CLI 界面的想法。对我而言,最伟大的 REPL 工具是 IPython。该工具可自动完成你的代码,让你轻松定义函数,悠闲地访问文档,还有其他的多个惊艳的特性。对我们不利的是,该工具用于 Python 而非 PHP。
PHP 世界里有种称之为 “互动模式” 的东西,可以通过终端工具访问,只需键入以下代码:
$ php -a
Interactive mode enabled
php >
本场景中即处于互动模式,能着手一些东西的测试。该模式很管用,不过太不直观了。我还是卖力地尝试了几次,由于我知道 IPython 的本事,因此令我根本不会继续用这个模式。
幸运的是,存在一款全新酷炫的 CLI (命令行界面) 工具,名叫 Psysh。 Psysh 是一款令人惊艳的工具,充满了引人注目的特性,可以全局安装,也可使用 composer 按项目安装。
对我而言最棒的 Psysh 特性就是内嵌文档功能。直接查询一个PHP函数的文档而无须跑到 Php.net 网站上,简直棒极了。 缺点是你在享用所有功能前还必须完成几件事。
该工具安装完毕后,为正确运行就要输入以下命令(我这里用的是 Debian ,未必适合所有人) :
$ apt-get install php7.1-sqlite3
$ mkdir /usr/local/share/psysh
$ wget <http://psysh.org/manual/en/php_manual.sqlite> -o /usr/local/share/psysh/php_manual.sqlite
第一条命令并不是强制性的并且如果你已经安装了 Sqlite 你可以跳过这一步。第二个命令创建目录来存储文档而第三条命令下载并将文档保存到先前创建的目录中。记住,所有这些命令都必须以 root
身份运行。
现在你有了这些:
psysh
指令文档说明的截图,显示关于 json_decode
的信息。
点击此链接前往 Psysh 了解更多关于这个炫酷的工具。
你应该开始测试
这是我每天对自己说的咒语。像很多人一样,我没有按照 TDD 的建议去测试代码。我现在已经养成测试习惯,并且已经持续了半年,然而还有很长的路要走。
当我面对一个复杂的遗留项目时,我决定学习测试。那个项目代码如此奇葩,以至于任何时间我添加一些代码都会出问题。 用新特性? 实现功能和制造问题!修改一个bug? 还是创建一个新的吧。
那是一个大问题,我在另一篇,并且是我开始尝试使用测试。
我想推荐的第一个工具是 PHPUnit。 正如官网展示的:
PHPUnit 是一个面向程序员的PHP测试框架
PHPUnit 是一个实例 xUnit 架构的单元测试框架
所以,PHPUnit 是一个为你的项目生成统一测试的框架,它会提供一些函数去测试你的代码并且有漂亮的结果输出。
自从我开始考虑测试,阅读和与人交谈它,我发现另一个很棒的工具,它会补充你在这些统一测试中的工作。它就是 Behat,一个 PHP 的 BDD 框架。
BDD(行为驱动开发)是来自 TDD(测试驱动开发)的开发过程。这些缩略词现在不重要,重要的是您可以使用更自然的语言来指定您的测试,这是非技术人员可以理解的语言。
这个语言被称为 Gherkin,用于描述正在测试的预期行为,使用 Gherkin的测试描述,如下所示:
在这些行后面有 PHP 代码,只有在该方法的 PhpDoc 中指定的行和正则表达式之间存在匹配,就会调用该代码。该代码使用你的 SDK、应用程序或者 web 系统实现这些步骤以及真正的用户将执行的操作
Behat 的工作流程十分流畅。在一切正确配置之后,你就可以开始编写测试功能的所有可能方案。当你首次运行 Behat 时,它会提供你所有那些你应该添加到 PHP Context 类中的方法模板以便实现场景中的每一个步骤。
在那之后,你就可以为每一个步骤编写实际代码并重复此循环。
- 为每一个步骤编写 PHP 代码
- 运行测试
- 如果一切正常,为其它步骤编写 PHP 代码
- 如果有地方出了问题,修复它
在配置和阅读文档半小时后,你可以准备使用 Behat,到最后你会发现全都是 PHP 代码并且已经发现你已经知道如果使用它编程。
持续集成
持续集成( CI ) 是一个过程,它提供一个为软件工程师创建软件的一个方法。
简单的说,它就是经常(可能一天几次)将小块代码整合进基础代码当中的行为。代码已经测试过且不会出现突发情况。CI 帮我我们自动构建,测试和部署到我们的应用中。
只要几次点击,就可以将你的 Github 的项目集成到 Travis CI 中之后你每次将代码推送到仓库,它会运行你创建的 PHPUnit 和 Behat 文件,并告诉你最近的功能是否已经准备,或没有,或将要被合并。除此之外,你可以使用 Travis CI 将你的代码部署到生产环境中运行。
通过一个明确定义的工作流程来完成工作流程是非常好的,Travis CI 可以帮助我们完成这个工作。阅读这篇 Getting started ,了解软件开发过程是如此有趣而并不仅仅是代码本身。
遵循 PSR-1 和 PSR-2
如果你还听说过 PSR ,那你应该马上去了解。实际上,PSR 是 PHP Standard Recommendations 的简写,是由 PHP-FIG (PHP Framework Interop Group) 推出的。PHP-FIG 是由一些大的 PHP 项目、框架、CMS的成员组成的组织,旨在思考这门语言的未来、生态,讨论语言中应遵循的标准。
很长一段时间以来,PHP 没有编码风格之说。我的年纪还不是很大,但是每一次我看别人的项目或库的时候,它们都使用不同的编码风格。有时候花括号在这个位置,有时候它又在下一行,一个长行的处理方式也会有好几种,各种不同的编码风格和喜好混合在一起,一团糟。
PHP-FIG 做了很多的工作,通过推出统一的编码规范,他们好像在说:“不要再纠结编码风格了,让我们所有人都遵循一个标准,然后重心都集中于好软件的制作上吧”。现在,无论什么时候你想阅读某人的代码时,你只需要关心代码是如何运行的就可以了,而不用再指责他的代码风格和结构了。
截止至此篇文章发布,已经有9个达成共识的 PSR 标准推出,为一般问题提供了通用解决方案。如果你还不知道这些标准,就从 PSR-1 和 PSR-2 开始吧。
这些标准提出了现代 PHP 的编码风格,确保你已经读过并已经开始使用它们了。别想着你能在写代码的时候全部想着它们,这是一个漫长的过程,但是你应该知道,有一些工具可以辅助你使用和记住它们。
PHP CodeSniffer 就是一个你能在 Packagist 上找到并使用 Composer 安装的工具。我认为这个库的名字并不是很理想,因为它实际上包含了两个工具, phpcs 和 phpcbf。
Phpcs 用于代码风格检测,它会全面扫描你的代码,找出那些不符合已经配置好的编码规范的部分。
你可以使用 phpcs 内置的很多种编码规范,也可以自定义编码规范。在扫描的最后,它会为你列出不符合编码规范的代码片段,非常棒。
那么,怎么才能把错误改正呢?你可以打开每一个文件,改代码,再运行 phpcs ,看看是否还有错误,然后重复这个过程。非常无聊。
为了解决这个问题,PHP CodeSniffer 提供了另一个工具,叫做 phpcbf 或 PHP Code Beautifier。在同一套编码规范设置下,运行 phpcbf,它就会在不破坏你的代码的前提下,尽最大努力为你改正所有的错误。
试着建立在代码提交之前运行 phpcs 和 phpcbf 的习惯,这将会保证你所有的代码都符合编码规范,如果有人喜欢你的工具(或工程)并且想贡献代码,他们在阅读你的代码时将不会有任何阻碍。
框架
我不打算花费太多的时间来讨论框架,现在已经有一些不错的框架了,或流行或小众。个人而言,更倾向于不使用那些内置所有功能的重型框架,我的想法是,你仅仅选择你需要的那个就好了。
如果你需要一个 HTTP 客户端,你可以使用 Guzzle。如果你需要使用模板引擎,那么你可以使用 Twig。如果你需要一个路由,那么找一个能够满足你需求的组件并使用它就好了。将这些组件组装起来,打造你自己的应用吧。
Symfony 框架沿着这个方向已经做了很伟大的工作。你可以为你的项目使用整个框架,或者仅仅选择并使用你想要使用的一部分。就是那么的简单。
然而,无论何时我想使用框架来完成一个应用时,我总会从为被称为微框架的那些框架中选择一个。它们真的很轻,仅仅提供基本的功能,易于定制化,并且可以方便的让它来适应你的项目架构。
我选择的微框架是 Slimframework ,我觉得你应该读一读它。对于处理小型项目,它真的很简单,但是对于较大的项目,使用它就有些复杂了。
顺便向正准备编程的同学们说一下,我真心觉得,在你选择一个框架并打算一直使用它之前,你应该动手创造一个属于你自己的框架。这会让你理解框架的运行机制,并且能更快地适应大型框架。
现代PHP工具包
让我们用一系列工具包来结束文章。 对我来说,这些组件、工具和库描绘了现代PHP的样子:
- Slimframework: 一个很好、很酷的小型框架
- Symfony:一个由很多优秀、可重用组件构成的重量级框架
- Guzzle::可以很简单容易发起HTTP请求的客户端
- PHPUnit: 一个测试框架
- Behat: 行为驱动的测试框架
- PHPCS/CBF:代码规范、美化工具
- Faker:生成测试数据的库
- Psysh: 充满令人惊讶的交互式控制台
- Composer:依赖管理,且有着其他很多有用的特性
- Packagist:PHP包仓库
- Twig: 模板引擎
我知道,文章的标题真的有些狂妄。其实我想要说的是PHP正在进化,PHP生态圈也在以同样(也许更快)的速度进步。
讨论请前往:https://laravel-china.org/top...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。